用C语言打印Amstrong Number时缺少407

时间:2015-05-07 12:55:11

标签: c codeblocks

我使用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);
            }

}

有人告诉我一个解释吗?

3 个答案:

答案 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,它是整数

的pow