我使用Code :: Block 10.02并在C.I中打印Amstrong Number时等待这样的结果:
153
370
371
407
但它只是打印:
153
370
371
这是我在C:
中的代码#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
int a,b,c;
for (a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
{
if(pow(a,3)+pow(b,3)+pow(c,3)==100*a+10*b+c)
printf("\n%d%d%d",a,b,c);
}
}
这是我的屏幕:http://daynhauhoc.com/uploads/default/3011/9598a2ad2183198f.png
但是,当我使用这段代码时,它的工作非常好:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
int a,b,c;
for (a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
{
int d=pow(a,3)+pow(b,3)+pow(c,3);
int e=100*a+10*b+c;
if(d==e)
printf("\n%d%d%d",a,b,c);
}
}
有人告诉我一个解释吗?
答案 0 :(得分:4)
哦,我知道为什么!您使用pow(a,3)+pow(b,3)+pow(c,3)==100*a+10*b+c
但是pow()
返回double
您使用==
来确定是否存在相同的浮点数和整数。
不要在整数和浮点数之间使用==
或!=
!
答案 1 :(得分:3)
问题很可能是pow ()
函数是具有舍入错误的浮点函数。所以pow (4, 3)
不是64,但有些数字非常接近64.你将比较407和一个非常非常接近407的数字,有时会失败。
而不是pow (a, 3)
,只需撰写a*a*a
即可。
顺便说一句。舍入误差取决于pow
的确切实现,这在每台计算机上都不完全相同。所以这个“非常非常接近407”的数字在一台计算机上可能“只是略微大一些”,在另一台计算机上“只是略微小一些”,而巧合的是它可能在第三台计算机上“正好是407”。这解释了为什么有人说“为我工作”而其他人说“不起作用”。
顺便说一句。通过转换为int,您的结果将 down 舍入为整数。因此,如果一台计算机获得407.000000000000000001,则向下舍入为407,但如果另一台计算机获得406.999999999999999999,则向下舍入为406.
答案 2 :(得分:0)
出现此问题是因为pow
是double的函数,并且有些时间不正确,例如:9999.99999 = 10e4。
提示是使用powf
,它是整数