Test Message

a040: 阿姆斯壯數

內容

所謂 Armstrong number 指的是一個 n 位數的整數,它的所有位數的 n 次方和恰好等於自己。

如;1634 = 14 + 64 + 34 + 44

請依題目需求在一定範圍內找出該範圍內的所有 armstrong numbers.


輸入

輸入包含兩個數字 n, m(n<m, n>0, m<=1000000),代表所有尋找 armstrong number 的範圍

100 999
10 99

輸出

將所有範圍內的 armstrong number 依序由小到大輸出,如果沒有找到請輸出 none.

153 370 371 407
none


解題思路

先建好阿姆斯壯數表,之後用建好的表快速進行判斷。


完整程式碼

AC (23ms, 80KB)
#include <stdio.h>

int n, m , arms[20], aLen;
char hasAns;

inline int pow(int src, int p)
{
int res = src;
while (--p)
res *= src;
return res;
}

void SetArmsList()
{
int now = 0, tmp[6], i, j, k, sum;
for (i = 1; i < 1000000; i++)
{
now = i, j = k = sum = 0;
for (; now; j++, now /= 10)
tmp[j] = now % 10;
for (; k < j; k++)
sum += pow(tmp[k], j);
if (sum == i)
arms[aLen++] = i;
}
}

int main()
{
SetArmsList();
while (scanf(" %d %d", &n, &m) == 2)
{
hasAns = 0;
for (int i = 0; i < aLen && arms[i] <= m; i++)
{
if (arms[i] >= n)
printf("%d ", arms[i]) , hasAns = 1;
}
if (hasAns)
putchar('\n');
else
puts("none");
}
return 0;
}