Codebar 程式酒吧

一座輕鬆學習程式的酒吧

0%

a040. 阿姆斯壯數

題目連結

https://zerojudge.tw/ShowProblem?problemid=a040

解題思路

由題目可知阿姆斯壯數的判斷方法為將待判斷的數字依照位數分拆成各個數字後,依照待判斷數字的位數n次方後,再判斷各位數的次方和是否等於待判斷的數字。故本題的兩個關鍵分別是判斷輸入數字的位數,以及取各個位數的n次方。

注意事項

本題中使用了pow()函式表示指數寫法,其中第一個參數代表指數的底數,第二個參數代表次方。由於pow()函式並非標準函式庫裡的函式,使用前必須先引用 <math.h> 函式庫。另外需注意pow函式的回傳值為double型態,因此需使用(int)寫法轉為int型態。

程式碼:C語言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <math.h>
int main() {
//宣告並讀取變數n、m,代表判斷範圍的上下限
int n, m, test = 0;
scanf("%d %d", &n, &m);
//利用for迴圈跑從n到m的所有數字
for(int num = n ; num <= m ; num++) {
//宣告變數num,代表檢查到的數;宣告變數len,代表此數的位數
int i = num, len = 1;
//若此數大於等於10,就將其除以10,並將len加一
while(i >= 10) {
i /= 10;
len++;
}

//宣告變數sum,代表各個位數的總和
int sum = 0;
//從最高位開始,將此數的各個位數len次方後相加
for(int i = len ; i > 0 ; i--)
//num為目前判斷的數字,共len位數,i代表目前檢查到的位數
//將num%pow(10, i)即可得num在i位以後(含)的數字,/pow(10, i-1)可得num在i-1位以前的數字,即為第i位數字
sum += pow((num%(int)pow(10, i)/(int)pow(10, i-1)), len);
//若此len位數的數字,各個位數的len次方和等於自己,即為阿姆斯壯數,需輸出
if(sum == num) {
printf("%d ", num);
test++;
}
}
//若範圍內的數字皆無阿姆斯壯數,輸出None
if(test == 0)
printf("none");
return 0;
}