C语言打印Armstrong Number时缺少407

Missing 407 when print Amstrong Number in C language

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

}

有人告诉我一个解释吗?

哦,我知道为什么了!!你用pow(a,3)+pow(b,3)+pow(c,3)==100*a+10*b+c 但是pow() return double 你用== 来判断float 和integer 是否相同。 不要在整数和浮点数之间使用 ==!=

问题很可能是pow ()函数是一个有舍入误差的浮点函数。所以 pow (4, 3) 不是 64,而是某个非常非常接近 64 的数字。您将比较 407 和一个非常非常接近 407 的数字,有时会失败。

而不是pow (a, 3),只写a*a*a

顺便说一句。舍入误差取决于 pow 的确切实现,这在每台计算机上并不完全相同。所以这个 "very very close to 407" 的数字在一台计算机上可能是 "just very slightly larger",在另一台计算机上可能是 "just very slightly smaller",巧合的是它在第三台计算机上可能是 "exactly 407"。这就解释了为什么有人说 "works for me" 而其他人说 "doesn't work"。

顺便说一句。通过转换为 int,您的结果将 向下 舍入为整数。因此,如果一台计算机获得 407.000000000000000001,则四舍五入为 407,但如果另一台计算机获得 406.999999999999999999,则四舍五入为 406。

出现这个问题是因为 pow 是 double 的函数,有些时候不正确,example:9999.99999 = 10e4.

一个技巧是使用powf,它是整数的pow