一个正整数被称为 n 阶的阿姆斯特朗数,如果
abcd... = an + bn + cn + dn +
对于一个三位数的阿姆斯特朗数,其每个数字的立方和等于该数本身。例如,153 是一个阿姆斯特朗数,因为
153 = 1*1*1 + 5*5*5 + 3*3*3
在本程序中,我们将打印两个整数之间的所有阿姆斯特朗数。这意味着这两个整数不包含在范围内,而只打印它们之间的整数。
例如,假设我们要打印 153 和 371 之间的所有阿姆斯特朗数。这两个数字也都是阿姆斯特朗数。
那么,这个程序将打印所有大于 153 且小于 371 的阿姆斯特朗数,即 153 和 371 将不会被打印,即使它们是阿姆斯特朗数。
提示:在尝试此程序之前,请先学习如何检查一个整数是否为阿姆斯特朗数。
两个整数之间的阿姆斯特朗数
#include <math.h>
#include <stdio.h>
int main() {
int low, high, number, originalNumber, rem, count = 0;
double result = 0.0;
printf("Enter two numbers(intervals): ");
scanf("%d %d", &low, &high);
printf("Armstrong numbers between %d and %d are: ", low, high);
// swap numbers if high < low
if (high < low) {
high += low;
low = high - low;
high -= low;
}
// iterate number from (low + 1) to (high - 1)
// In each iteration, check if number is Armstrong
for (number = low + 1; number < high; ++number) {
originalNumber = number;
// number of digits calculation
while (originalNumber != 0) {
originalNumber /= 10;
++count;
}
originalNumber = number;
// result contains sum of nth power of individual digits
while (originalNumber != 0) {
rem = originalNumber % 10;
result += pow(rem, count);
originalNumber /= 10;
}
// check if number is equal to the sum of nth power of individual digits
if ((int)result == number) {
printf("%d ", number);
}
// resetting the values
count = 0;
result = 0;
}
return 0;
}
输出
Enter two numbers(intervals): 200 2000 Armstrong numbers between 200 and 2000 are: 370 371 407 1634
在程序中,外循环从 (low+ 1) 迭代到 (high - 1)。在每次迭代中,都会检查 number 是否为阿姆斯特朗数。
在外循环内部,首先计算整数的位数并存储在 count
中。然后,将各位数字的幂之和存储在 result 变量中。
如果 number 等于 result
,则该数字是阿姆斯特朗数。
注意事项
- 如果用户输入的 high 小于 low,则需要交换 low 和 high。欲了解更多信息,请查看我们关于交换两个数字的示例。
- 在外循环的每次迭代中,都需要将 count 和 result 重置为 0。