PAT甲級真題1069 數字黑洞(巧妙解法)

小王子y發表於2020-11-09

對於任何各位數字不完全相同的四位整數,我們將該數字的四個數位按非升序排列,得到一個數字,再按非降序排列,得到另一個數字,將兩個數字相減就能得到一個新的數字。

不斷重複這個過程,我們就能得到數字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;
}

相關文章