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.

Input Specification:

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

Output Specification:

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 6174comes out as the difference. All the numbers must be printed as 4-digit numbers.

Sample Input 1:

6767

Sample Output 1:

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

Sample Input 2:

2222

Sample Output 2:

2222 - 2222 = 0000

思路

这题用字符串来做还是很简单的,因为string既能直接用insert直接高位补0,又能用sort函数和reverse函数进行排序和反转,还能stoi转成int型进行计算(题目要求的所有操作string都能做到哈)。

但是这题有个很坑的地方:输入可能是个int型数据,而不是4位数字,比如输入的数据可能是123

测试点2、3、4卡了我很久,直到我看到了【【PAT甲级】1069 The Black Hole of Numbers (20 分)】这篇文章,博主谈到了:

这道题一反常态的输入的数字是一个int类型而不是包含前导零往常采用字符串的形式输入,所以在测试点2,3,4如果用字符串输入会超时。。。。。

没错,这题就是这么坑爹,说好的【Given any 4-digit number, you are supposed to illustrate the way it gets into the black hole.】,然而输入的时候所谓的4-digit number居然有可能是123这种三位数字??(这不是纯坑人嘛~),因此,在输入之后就要对当前输入的字符串进行高位补0操作,否则第一步就是321-123=0198(以输入123为例)。

代码

#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
    string tmp, first, second;
    cin>>tmp;
    while(tmp.length()<4){
        tmp.insert(0, "0");//高位补0
    }
    while(1)
    {
        sort(tmp.begin(), tmp.end());
        second = tmp;//从小到大
        reverse(tmp.begin(), tmp.end());
        first = tmp;//从大到小
        tmp = to_string(stoi(first) - stoi(second));
        while(tmp.length()<4){
            tmp.insert(0, "0");//高位补0
        }
        cout<<first<<" - "<<second<<" = "<<tmp<<'\n';
        if(tmp=="6174"||tmp=="0000") break;
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值