18.12.09-C語言練習:黑洞數 / Kaprekar問題


 

題目:

程序:

 1 #include <stdio.h>
 2 
 3 int main(void) {
 4     int n, a, b, c, t, A, B;
 5     printf("輸入一個三位數整數:");
 6     scanf("%d",&n);
 7     do{
 8         /*a, b, c 分別是百位數,十位數,個位數*/
 9         a = n/100;
10         b = (n%100)/10;
11         c = (n%10);
12         /* 百位數,十位數,個位數按照從大到小的順序重排,以便下一步中求重排后的最大值A和最小值B*/ 
13         if(a<b) {
14             t = a; a = b; b = t;
15         }
16         if(a<c) {
17             t = a; a = c; c = t;
18         }
19         if(b<c) {
20             t = b; b = c; c = t;
21         }
22         /*從排后的最大數A與最小數B*/ 
23         A = a * 100 + b * 10 + c;
24         B = c * 100 + b * 10 + a;
25         /*將最大數與最小數的差,重新賦給變量n,以便做循環判斷或下次循環使用*/
26         n = A - B;
27         /*輸出過程*/
28         printf("%d - %d = %d\n", A, B, n);
29     } while(n!=495 && n!=0);
30     return 0;
31 }

程序說明:

1. 程序大體思路可以看程序中注釋,大體分為兩個步驟:輸入和循環中計算。其中循環中計算過程分為這么幾個步驟:求個位十位百位上三個數字;個位十位百位三個數字按從大到小排列;求得重排后的最大值和最小值;求差和輸出。

2. 難點在於:(1)求個位十位百位數字;(2)確定循環變量n;(3)黑洞數算法計算過程的程序表達。

3. 關於循環變量n: 因為算法中要求的是重排后數字的最大值與最小值之差。所以n是循環變量。

運行結果:

 

錯誤程序:

 

錯誤或可優化部分分析:

1. (錯誤)變量名混用導致棋藝:c和C混用了,難以分清c 和C的具體含義。根據程序理解可能是:(1)個位十位百位三個數字中的一個。(好像小寫c是這個意思);(2)重排后的差。(好像大寫C是這個意思)。但在while循環判斷的時候用錯了。

2. (可能是錯誤)個位十位百位計算過程應該向上移動若干行:這里是否是個錯誤,主要看你對算法實現的過程,還有就是算法中的循環變量使用的是哪個。

3. (可優化)定義的變量最好不要用double:因為這里要求的數字范圍總是整數,並且不超過3位數,所以用 int 類型最方便。用double雖然不算錯誤,但會在計算過程中轉化為int類型,所以用double沒必要。在具體程序中根據具體類型選擇適當的數據類型即可,不必使用更寬范圍的類型。

4. (可優化)求個位、十位、百位數字計算的優化:(假設表達式中用的是重排后的差,下面說明中我改成了大寫C)

 a = ((int)C/100)%10   (int)C/100 結果是百位數之前的部分,因為C是三位數,所以(int)C/100結果是百位數。因為C是三位數,雖然這里沒錯但沒必要再進行 %10 求余。

另外就是因為定義C是double類型,實際計算是用int類型,所以這里使用了強制類型轉換,反而更麻煩。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM