习题5.6 “数学黑洞“
\"数学黑洞\":任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数。重复进行上述运算,会发现一个神秘的数。
//************************************************//* Source Name: ChapterFive_ExerciseSix.cpp//* Founction : Mathematical black holes//* Author : Skyera//* Create Time : 2025-7-25//* Modify : //* Modify Time://************************************************#include #include #include #include using namespace std;// 将数字分解为单个数字vector getDigits(int num){vector digits;// 处理特殊情况:如果是0,确保有4个0if(num == 0){for(int i = 0; i 0){digits.push_back(num % 10);num /= 10;}// 确保有4个数字(补0)while(digits.size() < 4){digits.push_back(0);}return digits;}// 计算下一步的数字int nextNumber(int num){vector digits = getDigits(num);// 排序得到最大数和最小数sort(digits.rbegin(), digits.rend()); // 降序排列int maxNum = digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3];sort(digits.begin(), digits.end());int minNum = digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3];// 输出当前步骤信息cout << setw(4) << setfill(\'0\') << maxNum << \'-\' << setw(4) << setfill(\'0\') << minNum << \'=\' << maxNum - minNum << endl;return maxNum - minNum;}// 输出当前步骤信息void findBlackHole(int num){// 检查是否为4位数字if(num 9999){cout << \"请输入一个4位自然数!\" << endl;return; }// 检查是否所有数字都相同(如1111)vector digits = getDigits(num);bool allSame = true;for(int i = 0; i < 4; i++){if(digits[i] != digits[0]){allSame = false;break;}}if(allSame){cout << \"输入的数字各位都相同,结果将是0!\" << endl;return;}cout << \"计算过程:\" < 100){cout << \"超过最大计算步骤,可能出现异常\" << endl;return;}}cout << \"经过\" << steps << \"步,得到数学黑洞\" << current << endl;}int main(){int num;cout <> num;findBlackHole(num);return 0;}