PAT1019 数字黑洞 (20)

给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …

现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入格式:

输入给出一个(0, 10000)区间内的正整数N。

输出格式:

如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。

输入样例1:
6767
输出样例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
输入样例2:
2222
输出样例2:
2222 - 2222 = 0000
解题思路:输入的是整型,第一步:将整型转成int数组,排序。第二步:将排序好的数组再转成整型然后想减。第三步:判断结果是否等于6174,如不等返回第一步。代码如下:
一,整型转成int数组

int *IntList(int num){
    int *list;
    list = new int[4];
    int tmp = 0;
    for (int i = 0, j = 3; i < 4; ++i){
        tmp = num % 10;
        list[j--] = tmp;
        num = num / 10;
    }
    return list;
}

二,排序,返回排序好的整型数

int BubbleSort(int n,bool flag){
    int *num;
    num = IntList(n);
    bool need = true;
    int k = 3,result=0;
    for (int k = 1; k < 4 && need; ++k){
        need = false;
        if (flag){
            for (int i = 0; i < 4 - k; ++i){
                if (num[i]>num[i + 1]){
                    int tmp = num[i];
                    num[i] = num[i + 1];
                    num[i + 1] = tmp;
                    need = true;
                }
            }
        }
        else{
            for (int i = 0; i < 4 - k; ++i){
                if (num[i]<num[i + 1]){
                    int tmp = num[i];
                    num[i] = num[i + 1];
                    num[i + 1] = tmp;
                    need = true;
                }
            }
        }
    }
    for (int i = 0; i < 4; ++i){
        result += num[i] * pow(10, k);
        --k;
    }
    return result;
}

三,主函数

void PAT1019(){
    int x ;
    cin >> x;
    int a = 0, b = 0;
    //f=false为大到小排,f=true为小到大排
    while (x!= 6174){
        a = BubbleSort(x, false); b = BubbleSort(x, true);
        if (a == b){ cout << a<<"-"<<b<<"="<<"0000" << endl; break; }
        x = a - b;
        if ((b / 1000) == 0)cout << a << "-" << "0" << b << "=" << x << endl;
        else cout << a << "-" << b << "=" << x << endl;
    }
}

方法二

//f=1从小到大,f=0从大到小
int Upfuned(int x,bool f){
    string tmp;
    stringstream ss;
    ss << x;
    ss >> tmp;
    ss.clear();
    sort(tmp.begin(), tmp.end());
    if (f){
        ss << tmp;
        ss >> x;
        return x;
    }
    else{
        reverse(tmp.begin(), tmp.end());
        ss << tmp;
        ss >> x;
        return x;
    }

}
void PATexe(){
    int x = 1887;
    int a = 0, b = 0;
    while (x != 6174){
        a = Upfuned(x, 0);
        b = Upfuned(x, 1);
        x = a - b;
        if (x == 0){
            cout << a << '-' << b << '=' << "0000" << endl;
            break;
        }
        cout << a << '-';
        b < 1000 ? cout << '0' << b : cout << b;
        cout << '=' << x << endl;   
    }
}

四,输出结果
输入样例1:
7676
PAT1019 数字黑洞 (20)_第1张图片
输入样例1:
2222
PAT1019 数字黑洞 (20)_第2张图片

你可能感兴趣的:(C++,pat)