PTA数字黑洞 c++

给定任一个各位数字不完全相同的 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时,一直循环。
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42082542/article/details/84257899