PAT乙級 1019 數字黑洞 C語言

2021-08-11 21:30:33 字數 2587 閱讀 6784

題目

給定任乙個各位數字不完全相同的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

這道題的題意邏輯非常簡單,主要難點是要在「字串」和 「數值」之間轉換,因此要熟悉atoi(),sprintf()函式的使用(gcc預設不支援itoa(),所以用sprintf()代替)

注意

1. 使用者輸入的數字如果小於四位數,需要在左邊用『0』補齊

2. 每一輪計算中如果出現小於四位數的數字,也要用『0』補齊

3.如果使用者輸入的數字是「6174」,也應該進行計算,而不是直接結束!

4. 當數字正序 == 倒序,結果為「0000」

思路

字串形式獲取輸入,補齊『0』

while(num[ ]是使用者的輸入 或 num[ ]!=『6147』)

……..差=(num[ ]降序,轉換為數值)- (num[ ]公升序,轉換為數值 )

…….. 將差轉換為字串,給num[ ]

**如下:

#include

#include

#include

#define size 5

#define end "6174"

char * descent(char *);//降序排序

char * ascent(char *);//公升序排序

int main(void)

else

printf("%s - %s = %04d\n",num,aux,result);//補齊『0』

sprintf(num,"%04d",result);//補齊『0』

}

return

0;}

char * descent(char * a)

}return a;

}char * ascent(char * a)

}return a;

}

小結

使用c的庫函式可以非常方便地在「字串」和「數值」之間進行轉換。

上述**中使用的:

……..int atoi(char * pstr): 字串轉換為int數

……..int sprintf(char * pstr,「字串格式」,若干引數) :這個真的太好用了!這樣就可以將引數3中指定的引數利用引數2的」字串格式「進行格式化之後,寫入到作為快取的引數1字串中…甚是強悍!

其中注意到函式的引數2,其實是const char *型別,也就是常數指標,我們平時習慣的」%d」等格式其實使用的是」支付字面量「,而這裡其實是可以放指標的········

其他類似的實用函式還有

1. atol :字串 轉 長整型

2. atoll : 字串 轉 long long

3. strtod(const char *nptr, char **endptr) :字串 轉 double,

還自帶正確性檢驗功能(將nptr字串轉換為double, 轉換結束的時候endptr指向最後乙個成功轉換的字元的下乙個字元…….這是乙個很有用的特性,事先如果輸入是合法數值,那麼自然endptr指向』\0』,而如果輸入不合法,就會指向遇到的第乙個不合法的字元)     

4.類似的還有:strtol() ,strtoul(), strtof() 等等。。。

PAT 乙級 1019 數字黑洞

例如,我們從6767開始,將得到 7766 6677 1089 9810 0189 9621 9621 1269 8352 8532 2358 6174 7641 1467 6174 現給定任意4位正整數,請編寫程式演示到達黑洞的過程。輸入格式 輸入給出乙個 0,10000 區間內的正整數n。輸出格...

PAT乙級 1019 數字黑洞

給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫kaprekar常數。例如,我們從6767開始,將得到 7766 6677 10...

PAT乙級1019 數字黑洞

時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停...