PAT乙級1019 數字黑洞
阿新 • • 發佈:2018-12-01
1019. 數字黑洞 (20)
時間限制 100 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 CHEN, Yue
給定任一個各位數字不完全相同的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位數格式輸出。
輸入樣例1:6767
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174輸入樣例2:
2222輸出樣例2:
2222 - 2222 = 0000
注意本題有一個很坑的地方是輸入的時候是輸入“4”,而不是“0004”,所以剛開始不知道造成了答案錯誤和執行超時。後來更改了一下程式,用十進位制讀入在用加前導0的方法輸出給字串,再進行排序和輸出。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define size 10
int compbigtosmall(const void*a, const void*b);
int compsmalltobig(const void*a, const void*b);
int allsame(char *a,int len);
int main(void)
{
char str[size];
memset(str, 0, sizeof(str));
int a;
scanf("%d",&a); //以十進位制格式讀入
sprintf(str, "%04d", a); //加前導0輸出給字串
int origin = atoi(str); //字串轉換成int格式的整型的函式
int len = strlen(str);
if (allsame(str, len)) //判斷是否四個位置的數字都相等
{
printf("%04d - %04d = %04d\n", origin, origin, origin - origin);
return 0;
}
int D_value;
do {
qsort(str, len, sizeof(char), compbigtosmall); //從大到小排
int big = atoi(str);
qsort(str, len, sizeof(char), compsmalltobig); //從小到大排
int small = atoi(str);
D_value = big - small;
sprintf(str, "%04d", D_value);
printf("%04d - %04d = %04d\n", big, small, D_value); //輸出
} while (D_value != 6174);
return 0;
}
int compbigtosmall(const void*a, const void*b)
{
return *(char*)b - *(char*)a;
}
int compsmalltobig(const void*a, const void*b)
{
return *(char*)a - *(char*)b;
}
int allsame(char * a,int len)
{
for (int i = 0; i < len - 1; i++)
{
if (a[i] != a[i + 1])
{
return 0;
}
}
return 1;
}