PAT甲级 1069 The Black Hole of Numbers(20) (思维+模拟)

题目

For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second number from the first one. Repeat in this manner we will soon end up at the number 6174 -- the black hole of 4-digit numbers. This number is named Kaprekar Constant.

For example, start from 6767, we'll get:

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

Given any 4-digit number, you are supposed to illustrate the way it gets into the black hole.

输入

Each input file contains one test case which gives a positive integer N in the range (0,10^{4}).

输出

If all the 4 digits of N are the same, print in one line the equation N - N = 0000. Else print each step of calculation in a line until 6174 comes out as the difference. All the numbers must be printed as 4-digit numbers.

样例输入 

样例输入1:

6767
样例输入2:

2222

样例输出 

样例输出1:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
样例输出2:

2222 - 2222 = 0000

题意理解

给你一个数 你要将这个数重新排列 比如样例1中

6767 先按照这个数的降序排列 也就是排列成 7766 然后再升序排列 6677

然后两数想减 然后得到的结果再继续排列 相减

直到最后我们减出来的东西是 0 或者是 6174

题目大意就是让我们模拟这个过程 将所有的步骤输出出来

不管最后怎么处理 最后一定是能出来6174的 这是一个结论

要注意的是如果这个数子没有到四位数 我们要手动给这个数补上0

比如 189 就要输出 0189

剩下的就是模拟即可  

代码 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int turn1(int x){
    vector<int>re;
    while(x){
        int nu=x%10;
        re.push_back(nu);
        x/=10;
    }
    while(re.size()<4)re.push_back(0);
    sort(re.begin(),re.end());
    int res=0;
    for(int i=0;i<4;i++){
        res=res*10+re[i];
    }
    return res;
}
int turn2(int x){
    vector<int>re;
    while(x){
        int nu=x%10;
        re.push_back(nu);
        x/=10;
    }
    while(re.size()<4)re.push_back(0);
    sort(re.begin(),re.end(),greater<int>());
    int res=0;
    for(int i=0;i<4;i++){
        res=res*10+re[i];
    }
    return res;
}
int main(){
    int x,y;
    cin>>x;
    while(1){
        x=turn1(x);y=turn2(x);
        int res=y-x;
        printf("%04d - %04d = %04d\n",y,x,res);
        if(res==0||res==6174)break;
        x=res;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值