C++完整参考代码
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n; // 例如 4321
int steps = 0;
while (n != 6174) { // 一直迭代到数字黑洞
int d[4] = { n / 1000, n / 100 % 10, n / 10 % 10, n % 10 }; // 拆出四个数位
sort(d, d + 4); // 从小到大排序
int small = d[0] * 1000 + d[1] * 100 + d[2] * 10 + d[3]; // 升序重组的数
int big = d[3] * 1000 + d[2] * 100 + d[1] * 10 + d[0]; // 降序重组的数
cout << big << " - " << small << " = " << big - small << endl;
n = big - small; // 用差继续迭代
steps++;
}
cout << "共 " << steps << " 步到达 6174" << endl; // 4321 → 共 3 步
return 0;
}
答案:以 4321 为例,3 步到达 6174:4321−1234=3087 → 8730−0378=8352 → 8532−2358=6174。任意四位"不完全相同"的数最多 7 步也一定会掉进 6174 这个黑洞。
思路:把当前数拆成 4 个数位 → 排序 → 用这 4 个数字拼出"最大数"和"最小数" → 相减 → 拿结果继续重复,直到结果正好等于 6174 为止。拆位用整除和取余:千位 n/1000、百位 n/100%10、十位 n/10%10、个位 n%10。
考点:整数数位拆分、sort 排序、while 循环模拟迭代过程、数字黑洞(Kaprekar 常数)。
易错:① 拆位的权值 1000 / 100 / 10 写错,数位就全乱了;② 最小数要按升序重组,像 0378 这种前导 0 在整数里会显示成 378,写成 378 或 0378 都对;③ 如果输入本来就是 6174,循环一次都不执行、步数为 0,这是正常结果;④ 若 4 个数字全部相同(如 1111),差恒为 0,会永远推不到 6174 —— 题目已用"不完全相同"排除。