阿姆斯壮数是指一个n位数(n≥3),它的每个数位的n次方的和等于它本身。例如:371=3^3+7^3+1^3,因此371就是一个三位的阿姆斯壮数。
一个常见的阿姆斯壮数判断程序如下:
#include
int main() { int number, originalNumber, remainder, result = 0, n = 0 ;
printf("Enter an integer: "); scanf("%d", &number);
originalNumber = number;
while (originalNumber != 0) { originalNumber /= 10; ++n; }
originalNumber = number;
while (originalNumber != 0) { remainder = originalNumber % 10; result += pow(remainder, n); originalNumber /= 10; }
if (result == number) printf("%d is an Armstrong number.", number); else printf("%d is not an Armstrong number.", number);
return 0; }
问题在于,在计算n位数的指数之和时,如果使用pow函数对每个位上的数字求n次方,可能会产生精度损失或溢出,导致运行时错误。解决这个问题的方法是改用一个自定义的幂函数,通过循环依次计算每个数字的n次方并累计。
一个修改后的程序如下:
#include
int power(int base, int exponent);
int main() { int number, originalNumber, remainder, result = 0, n = 0 ;
printf("Enter an integer: "); scanf("%d", &number);
originalNumber = number;
while (originalNumber != 0) { originalNumber /= 10; ++n; }
originalNumber = number;
while (originalNumber != 0) { remainder = originalNumber % 10; result += power(remainder, n); originalNumber /= 10; }
if (result == number) printf("%d is an Armstrong number.", number); else printf("%d is not an Armstrong number.", number);
return 0; }
int power(int base, int exponent) { int result = 1; for (int i = 0; i < exponent; ++i) result *= base; return result; }
通过使用自定义的
下一篇:阿姆斯壮数问题