数字黑洞:揭秘6174的神奇数学现象

张开发
2026/4/20 6:02:53 15 分钟阅读

分享文章

数字黑洞:揭秘6174的神奇数学现象
好的我们来解决 GESP 2023年9月认证 C 二级编程题中的 数字黑洞 问题。问题描述数字黑洞 指的是一个数学现象对于任意一个四位数各位数字不完全相同按照以下步骤操作最终都会得到6174将数字的四个数字组成一个最大的四位数。将数字的四个数字组成一个最小的四位数(首位可以为0)。求出最大数与最小数的差。用这个差替换原来的数字。重复上述步骤直到得到的差为6174为止。现在你需要编写一个程序输入一个四位数n(保证n的各位数字不全相同)输出每一步得到的最大数、最小数以及它们的差直到差为6174为止。输出的每一步应包含该步的序号从1开始。输入样例1000输出样例1: 1000 - 0001 999 2: 9990 - 0999 8991 3: 9981 - 1899 8082 4: 8820 - 0288 8532 5: 8532 - 2358 6174解题思路验证输入确保输入是一个有效的四位数并且各位数字不全相同题目已保证。循环处理使用一个循环如while或do-while当当前数字不是6174时继续处理。提取数字将当前数字分解成它的四个数字千位、百位、十位、个位。例如对于1000数字是1,0,0,0。排序将这四个数字按降序排列得到最大数如1, 0, 0, 0-1000。按升序排列得到最小数如1, 0, 0, 0-0001即1。计算差值计算最大数与最小数的差。输出步骤按照要求的格式输出当前步骤号、最大数、最小数、差值。更新数字将差值作为新的数字进行下一轮处理。终止条件当差值为6174时停止循环。注意事项补零在组成最小数时如果升序后首位是0结果就是小于1000的数如0001就是1。在计算差值和输出时需要正确处理这种情况通常是输出时补足四位。步骤计数需要一个计数器从1开始每执行一步就增加1。C 代码实现#include iostream #include vector #include algorithm #include iomanip // 用于格式化输出 using namespace std; int main() { int n; cin n; int step 1; // 步骤计数器从1开始 int current n; // 当前处理的数字 // 当当前数字不是6174时继续循环 while (current ! 6174) { // 1. 分解数字 vectorint digits; int temp current; // 确保处理四位数字不足四位时前面补0通过循环4次实现 for (int i 0; i 4; i) { digits.push_back(temp % 10); // 取个位 temp / 10; // 去掉个位 } // 2. 排序以得到最大数和最小数 vectorint digits_desc digits; // 降序排列用于最大数 sort(digits_desc.begin(), digits_desc.end(), greaterint()); // 降序排序 vectorint digits_asc digits; // 升序排列用于最小数 sort(digits_asc.begin(), digits_asc.end()); // 升序排序 // 3. 组合成整数 int max_num 0, min_num 0; for (int i 0; i 4; i) { max_num max_num * 10 digits_desc[i]; // 计算最大数 min_num min_num * 10 digits_asc[i]; // 计算最小数 } // 4. 计算差值 int diff max_num - min_num; current diff; // 更新当前数字为差值用于下一轮 // 5. 输出当前步骤 cout step : ; // 输出最大数确保四位显示不足补0 cout setfill(0) setw(4) max_num - ; // 输出最小数确保四位显示不足补0 cout setfill(0) setw(4) min_num ; // 输出差值确保四位显示不足补0 cout setfill(0) setw(4) diff endl; step; // 步骤计数器增加 } return 0; }代码说明输入cin n;读入起始的四位数。初始化step记录步骤current记录当前要处理的数字。循环条件while (current ! 6174)确保在得到6174时停止。分解数字创建一个向量digits存放四个数字。使用for循环4次每次取current的个位数 (temp % 10)然后除以10去掉个位 (temp / 10)。这样循环4次后digits中按顺序存放了个位、十位、百位、千位顺序是反的但排序后会纠正。排序与组合创建两个向量digits_desc和digits_asc分别复制digits的内容。对digits_desc进行降序排序 (sort(... greaterint())。对digits_asc进行升序排序 (sort(...)默认升序)。分别遍历这两个排序后的向量将数字组合成整数max_num和min_num。计算差值diff max_num - min_num;并将current更新为diff。格式化输出使用setfill(0)和setw(4)确保max_num、min_num、diff在输出时都显示为四位数字不足四位的前面补0。按照步骤号: 最大数 - 最小数 差值的格式输出。步骤递增step为下一步做准备。这个程序严格遵循了 数字黑洞 的操作步骤并按照题目要求的格式输出每一步的结果。

更多文章