给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174
,这个神奇的数字也叫 Kaprekar 常数。
例如,我们从6767
开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
#include<iostream>
#include<iomanip>
using namespace std;
int MaxNumber(int a) {
int q = a,p=0;
int b[4] = { 0 };
for (int i = 0; i < 4; i++) {
b[i] = q % 10;
q = q / 10;
}//将四位数字各位分开,存到数组中
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4 - i-1; j++) {
if (b[j] < b[j + 1]) {
int num = b[j];
b[j] = b[j + 1];
b[j + 1] = num;
}
}
}//利用冒泡排序把四个数字从大到小排列
for (int i = 0; i < 4; i++) {
p = p * 10 + b[i];
}//把数组组成一个数字。
return p;
}//求出按四位数字从大到小排序的数字
int MinNumber(int a) {
int q = a, p = 0;
int b[4] = { 0 };
for (int i = 0; i < 4; i++) {
b[i] = q % 10;
q = q / 10;
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4 - i-1; j++) {
if (b[j] > b[j + 1]) {
int num = b[j];
b[j] = b[j + 1];
b[j + 1] = num;
}
}
}
for (int i = 0; i < 4; i++) {
p = p * 10 + b[i];
}
return p;
}//和上一个函数方法类似,将四位数字按从小到大组成一个新的数字
int main() {
int N,max,min;
int sum = 0;
cin >> N;
max = MaxNumber(N);//从大到小排列的数字
min = MinNumber(N);//从小到大排列的数字
if (max-min==0)
cout << setw(4) << setfill('0') << N << " " << "-" << " " << setw(4) << setfill('0') << N << " " << "=" << " " << "0000";//如果四位数字一样,输出
else {
while (sum != 6174) {
sum = max - min;
cout << max << " " << "-" << " " << setw(4)<<setfill('0')<<min << " " << "=" << " " << sum << endl;
max = MaxNumber(sum);
min = MinNumber(sum);
}//当数字相减不是6174时,一直循环。
}
}