习题5.6 “数学黑洞“
"数学黑洞":任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数。重复进行上述运算,会发现一个神秘的数。
//************************************************
//* Source Name: ChapterFive_ExerciseSix.cpp
//* Founction : Mathematical black holes
//* Author : Skyera
//* Create Time : 2025-7-25
//* Modify :
//* Modify Time:
//************************************************
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
// 将数字分解为单个数字
vector<int> getDigits(int num)
{vector<int> digits;// 处理特殊情况:如果是0,确保有4个0if(num == 0){for(int i = 0; i < 4; i++){digits.push_back(0);}return digits;}// 提取每个位的数字while(num > 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<int> 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 < 1000 || num > 9999){cout << "请输入一个4位自然数!" << endl;return; }// 检查是否所有数字都相同(如1111)vector<int> 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 << "计算过程:" << endl;int current = num;int steps = 0;// 循环计算直到得到6174while(current != 6174){current = nextNumber(current);steps++;// 防止意外的无限循环if(steps > 100){cout << "超过最大计算步骤,可能出现异常" << endl;return;}}cout << "经过" << steps << "步,得到数学黑洞" << current << endl;
}
int main()
{int num;cout << "请输入一个自然数(各位数字不能相同):";cin >> num;findBlackHole(num);return 0;
}