輸入一個三位數 n,判斷是否為水仙花數:各位數字立方和等於該數。如 153 = 1³ + 5³ + 3³。核心考點:位數分解、立方計算、已知結構驗證。
#include
int main() {
int num;
printf("輸入三位整數: ");
scanf("%d", &num);
if (num < 100 || num > 999) {
printf("非三位數\n");
return 1;
}
int a = num % 10; // 個位
int b = num / 10 % 10; // 十位
int c = num / 100; // 百位
if (num == a*a*a + b*b*b + c*c*c)
printf("%d 是水仙花數!\n", num);
else
printf("%d 不是水仙花數!\n", num);
return 0;
}
// 從低位到高位
int digit[10], len = 0;
int temp = num;
while (temp > 0) {
digit[len++] = temp % 10;
temp /= 10;
}
// digit[0] 個位, digit[1] 十位, ...
窮舉 100-999 驗證,僅有:
| 數字 | 分解驗證 |
|---|---|
| 153 | 1³ + 5³ + 3³ = 1 + 125 + 27 = 153 |
| 370 | 3³ + 7³ + 0³ = 27 + 343 + 0 = 370 |
| 371 | 3³ + 7³ + 1³ = 27 + 343 + 1 = 371 |
| 407 | 4³ + 0³ + 7³ = 64 + 0 + 343 = 407 |
bool is_armstrong(int n) {
int original = n, digits = 0, sum = 0;
int temp = n;
while (temp > 0) { digits++; temp /= 10; } // 計算位數
temp = n;
while (temp > 0) {
int d = temp % 10;
int p = 1;
for (int i = 0; i < digits; i++) p *= d; // d^digits
sum += p;
temp /= 10;
}
return sum == original;
}
// 已知阿姆斯壯數 (十進制): 1-9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, ...
bool is_armstrong_fast(int n) {
static int pow_cache[10][10] = {0}; // pow_cache[d][k] = d^k
static bool initialized = false;
if (!initialized) {
for (int d = 0; d <= 9; d++) {
pow_cache[d][0] = 1;
for (int k = 1; k <= 9; k++) pow_cache[d][k] = pow_cache[d][k-1] * d;
}
initialized = true;
}
int digits = 0, temp = n;
while (temp > 0) { digits++; temp /= 10; }
int sum = 0;
temp = n;
while (temp > 0) {
sum += pow_cache[temp % 10][digits];
temp /= 10;
}
return sum == n;
}
水仙花數是「位數分解、冪運算、有限解集驗證」的經典練習。關鍵收穫:
%10 取位,/=10 右移;pow_cache[10][10] 消除重複冪運算;