我用C语言编写了一个程序来判断一个整数是否是三位数的Armstrong number。如果用户给出的数字是Armstrong数,则打印it is an armstrong number
,如果不是Armstrong数,则打印its not an armstrong number
。它没有显示任何错误。它也适用于所有三位数字,除了一个数字。它是153
。这是打印,它不是一个阿姆斯特朗数,即使它是一个阿姆斯特朗数。有谁能告诉我这里出了什么问题吗?
下面是代码和输出:
#include <math.h>
#include <stdio.h>
int main() {
int sum = 0;
int n;
//asking the user to enter a number
printf("Enter a number : ");
scanf("%d", &n);
// copying the value of n in a variable b
int b = n;
while (n != 0) {
// storing the reminders of n divided by 10 in a variable
int r = n % 10;
// finding the power
sum = pow(r, 3) + sum;
n = n / 10;
}
// here I am printing the sum just to show you guys what is the answer i am getting
printf("%d\n", sum);
// if sum equals to b, then do this
if (sum == b) {
printf("The number is an armstrong number\n");
}
// if not then do this
else {
printf("It is not an armstrong number\n");
}
}
下面是我输入一个三位数的Armstrong数时得到的输出:
Enter a number : 370
370
The number is an armstrong number
Enter a number : 407
407
The number is an armstrong number
这里我输入了一个不是阿姆斯特朗数的数:
Enter a number : 100
1
It is not an armstrong number
153
是阿姆斯特朗数。下面是我输入153时发生的情况:
Enter a number : 153
152
It is not an armstrong number
它说153 is not a armstrong number
。为什么会发生这种情况?我该如何解决这个问题?
4条答案
按热度按时间nhhxz33t1#
标准C库中的
pow
实现是有缺陷的,即使数学结果可以精确表示,它也会返回近似值。别再用它来做立方体了。将
pow(r,3)
替换为r*r*r
。xhv8bpkk2#
你的代码可以在gcc编译器上运行。自己查https://godbolt.org/z/Pvo19xrxx
正如其他人提到的那样,使用
r*r*r
而不是pow。inkz8wg93#
mv1qrgav4#
问题可能与系统上
pow()
函数的实现有关。除非实现者对整数参数进行了特殊处理,否则pow(x, n)
可以计算为exp(log(x) * n)
,这可能会产生略小于预期整数结果的结果,因为log(5)
不能精确地表示为浮点数(即:124,999999999999
而不是125
)。转换为int
是作为小数部分的截断执行的,因此是124
而不是125
。不同的实现可能会产生稍微不同的结果,这取决于它们如何处理整数参数。这就解释了为什么你观察到一个问题,而其他系统上的人却没有。
有两种方法可以避免这个陷阱:
round(pow(r, 3))
来确保结果是最接近的整数,以防它不是预期的整数。r * r * r
,这是用整数运算执行的。下面是后一种方法的修改版本: