PAT(B1019.数字黑洞)

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

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

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。

输入格式:

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

输出格式:

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

using namespace std;

int compare(const int &a, const int &b){
    return a>b;
}

int main(){
    int n;
    scanf("%d", &n);
    if(n % 1111 == 0){
        printf("%d - %d = 0000\n", n, n);
        return 0;
    }
    else{
        int tmp = n;
        while(true){
            char c[5] = {'0','0','0','0','\0'};
            int a, b;
            for(int i = 3; tmp != 0; i--){
                c[i] = (tmp % 10) + 48;
                tmp /= 10;
            }
            sort(c, c + 4, compare);
            a = (c[0] - 48) * 1000 + (c[1] - 48) * 100 + (c[2] - 48) * 10 + (c[3] - 48);
            printf("%s - ", c);
            sort(c, c + 4);
            b = (c[0] - 48) * 1000 + (c[1] - 48) * 100 + (c[2] - 48) * 10 + (c[3] - 48);
            printf("%s = ", c);
            tmp = a - b;
            printf("%04d\n", tmp);
            if(tmp == 6174){
                break;
            }
        }
    }
    return 0;
}

 

PAT(basic level)数字黑洞问题运行超时

11-16

http://pat.zju.edu.cn/contests/pat-b-practise/1019rn题目如下:rn给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。rnrn例如,我们从6767开始,将得到rnrn7766 - 6677 = 1089rn9810 - 0189 = 9621rn9621 - 1269 = 8352rn8532 - 2358 = 6174rn7641 - 1467 = 6174rn... ...rnrn现给定任意4位正整数,请编写程序演示到达黑洞的过程。rnrn输入格式:rnrn输入给出一个(0, 10000)区间内的正整数N。rnrn输出格式:rnrn如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。rnrn输入样例1:rn6767rn输出样例1:rn7766 - 6677 = 1089rn9810 - 0189 = 9621rn9621 - 1269 = 8352rn8532 - 2358 = 6174rn输入样例2:rn2222rn输出样例2:rn2222 - 2222 = 0000rn我的代码如下:rn#includern#includern#includern#includernusing namespace std;rnrnvoid pv(vector v)rn for(int t = 0;t!=v.size();++t)rn cout< v)rn for(int t = v.size()-1;t>=0;--t)rn cout< v)rn int x = 0;rn for(int t = 0;t!=v.size();++t)rn x =10*x+v[t];rn return x;rnrnrnint rv2i(vector v)rn int x = 0;rn for(int t = v.size()-1;t>=0;--t)rn x =10*x+v[t];rn return x;rnrnrnvector i2v(int i)rn vector v;rn v.push_back(i/1000);rn i %= 1000;rn v.push_back(i/100);rn i %=100;rn v.push_back(i/10);rn v.push_back(i%10);rn return v;rnrnrnint main(void)rn string s;rn cin>>s;rn vector v(4);rn for(int t = 0;t!=4;++t)rn v[t] = s[t]-'0';rn if(v[0] ==v[1]&&v[1]==v[2]&&v[2]==v[3])rn pv(v);rn cout<<" - ";rn pv(v);rn cout<<" = 0000"<

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试