1. 程式人生 > >PAT乙級1019 數字黑洞

PAT乙級1019 數字黑洞

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
輸出樣例1:
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; }