使用Codeblocks和MinGW(32位)编译时,Armstrong数字程序产生错误的结果

时间:2014-03-15 06:09:19

标签: c windows

我想写一个程序来判断一个数字是否是一个非常强的数字。我为此编写了一个函数,如果数字是一个非常强的数字,则返回1,否则返回0。

我在函数中使用了以下代码:

int isArmsNum(int x)
{
    int m, r = 0, d, y;

    y = x;

    while (x > 0)
    {
        m = x % 10;
        r = r + pow(m, 3);
        x = x / 10;
    }

    if (r == y)
    {
        d = 1;
    }
    if (r != y)
    {
        d = 0;
    }

    return d;
}

现在问题是当我尝试检查程序153(这是一个非常强的数字)时,程序返回0并且只有当x = 1时才返回1.我在Visual Studio 2013中编译了相同的代码,它是工作正常。

我决定对Codeblocks进行一些调试(13.12),我发现, 在while循环中,(用x = 153检查)

  • 在第一次迭代之后,m = 3,r = 27,x = 15 //现在很好
  • 在第二次迭代后,m = 5,r = 151,x = 1 //这里是问题所在。 r应该是152,因为27 +(5 ^ 3)= 152

所以,当循环终止时,r的值应该是153.

这可能是什么问题?有任何想法吗?

[代码块13.12,GCC 4.7.1-32位MinGW]

[我的电脑在Windows 8.1 Pro 64位上运行]

[在其他IDE上测试了代码,工作了。也通过终端和Xcode使用GCC在OS X上试用,工作]

2 个答案:

答案 0 :(得分:2)

不要使用'pow'。使用'm * m * m'。库函数与双精度函数一起使用并且是近似的,但它可能稍微不精确。由于double到int转换截断,即使很小的错误也可能导致最终结果被1关闭。

答案 1 :(得分:0)

以下是不使用pow功能的代码

int isArmsNum(int x)
{
        int a = x / 100;
        int b = (x - a * 100) / 10;
        int c = (x - a * 100 - b * 10);

        int d = a*a*a + b*b*b + c*c*c;

        if(x == d) return 1;
        return 0;
}

参考:http://www.softwareandfinance.com/CSharp/Armstrong_Number.html