1. 程式人生 > >PAT1009. 1019. 數字黑洞 (20)

PAT1009. 1019. 數字黑洞 (20)

1019. 數字黑洞 (20)

時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述

給定任一個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到
 一個新的數字。一直重複這樣做,我們很快會停在有“數字黑洞”之稱的6174,這個神奇的數字也叫Kaprekar常數。
 
 例如,我們從6767開始,將得到
 
 7766 - 6677 = 1089
 9810 - 0189 = 9621
 9621 - 1269 = 8352
 8532 - 2358 = 6174
 7641 - 1467 = 6174
 ... ...
 
 現給定任意4位正整數,請編寫程式演示到達黑洞的過程。

輸入描述:

輸入給出一個(0, 10000)區間內的正整數N。

輸出描述:

如果N的4位數字全相等,則在一行內輸出“N - N = 0000”;否則將計算的每一步在一行內輸出,直到6174作為差出現,輸出格式見樣例,每行中間沒有空行。注意每個數字按4位數格
 式輸出。

輸入例子:

6767

輸出例子:

7766 - 6677 = 1089
 9810 - 0189 = 9621
 9621 - 1269 = 8352
 8532 - 2358 = 6174
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

void ret(int n,int& mmax,int& mmin)
{
    int a[4];
    int i = 0;
    while(n){
        a[i++] = n%10;
        n/=10;
    }
    sort(a,a+4);
    for(int i = 0; i < 4; i++){
        mmin = mmin*10+a[i];
        mmax = mmax*10+a[3-i];
    }
}


int main()
{
    int n,a = 0,b = 0;
    cin >> n;
    ret(n,a,b);
    if(a == b){
        printf("%04d - %04d = 0000\n",a,b);
    }
    else {
        while(true){
            printf("%04d - %04d = %04d\n",a,b,a-b);
            if(a-b==6174) break;
            n = a - b;
            a = b = 0;
            ret(n,a,b);
        }
    }
    return 0;
}