PAT甲级真题1069 数字黑洞(巧妙解法)

对于任何各位数字不完全相同的四位整数,我们将该数字的四个数位按非升序排列,得到一个数字,再按非降序排列,得到另一个数字,将两个数字相减就能得到一个新的数字。

不断重复这个过程,我们就能得到数字6174 ---- 这是四位数字的黑洞。

例如,给定数字 6767,过程如下:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …
给定任意一个四位数字,请你输出它进入黑洞的过程。

输入格式
包含一个正整数 NN。

注意,给定数字 NN 如果不足四位,则补充前导 00 至四位为止。

输出格式
如果 NN 的四位数字都相同,则输出一行 N - N = 0000。

否则,每行输出一个操作步骤,直到出现 61746174 作为差值产生为止。

所有数字都必须输出为四位数字。

数据范围
0<N<100000<N<10000
输入样例1:
6767
输出样例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
输入样例2:
2222
输出样例2:
2222 - 2222 = 0000

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> get(int n)
{
    int nums[4];
    for (int i = 0; i < 4; i ++ )
    {
        nums[i] = n % 10;
        n /= 10;
    }

    sort(nums, nums + 4);
    int a = 0;
    for (int i = 0; i < 4; i ++ ) a = a * 10 + nums[i];

    reverse(nums, nums + 4);
    int b = 0;
    for (int i = 0; i < 4; i ++ ) b = b * 10 + nums[i];

    return {b, a};
}

int main()
{
    int n;
    cin >> n;

    do
    {
        vector<int>  t = get(n);
        printf("%04d - %04d = %04d\n", t[0], t[1], t[0] - t[1]);

        n = t[0] - t[1];
    } while (n && n != 6174);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王子y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值