1. 数字黑洞现象解析
数字黑洞是数学中一个有趣的现象,指的是通过特定运算规则,任何符合条件的数字最终都会收敛到同一个固定值。在PTA B1019题目中,这个固定值就是6174,也被称为Kaprekar常数。
这个现象最早由印度数学家D.R.Kaprekar在1949年发现。具体规则是:对于任意四位数字(至少有两个不同数字),先将其数字按降序排列得到最大数,再按升序排列得到最小数,然后用最大数减去最小数。重复这个过程,最终必定会得到6174。
注意:输入数字必须是四位且至少有两个不同数字,否则无法形成有效减法运算。
2. 算法实现思路
2.1 输入处理与验证
首先需要处理用户输入的四位数字。这里有几个关键点需要注意:
- 输入数字必须是四位
- 至少要有两个不同的数字
- 不足四位的数字需要补零处理
在C++中,我们可以这样实现输入验证:
cpp复制int num;
cin >> num;
if(num < 0 || num > 9999) {
cout << "输入必须是四位正整数" << endl;
return -1;
}
2.2 数字分解与排序
将四位数字分解为单个数字是核心步骤。我们可以通过除法和取余运算实现:
cpp复制int digits[4];
digits[0] = num / 1000; // 千位
digits[1] = (num % 1000) / 100; // 百位
digits[2] = (num % 100) / 10; // 十位
digits[3] = num % 10; // 个位
排序可以使用标准库的sort函数:
cpp复制// 升序排列
sort(digits, digits+4);
// 降序排列
sort(digits, digits+4, greater<int>());
3. 完整算法实现
3.1 主循环逻辑
算法的主循环需要持续执行以下步骤,直到结果为6174或0:
- 将数字分解为四个数字
- 分别生成最大和最小排列
- 计算差值
- 输出当前步骤
- 判断是否终止
cpp复制while(true) {
// 分解数字
