我想写一个程序来判断一个数字是否是一个非常强的数字。我为此编写了一个函数,如果数字是一个非常强的数字,则返回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检查)
所以,当循环终止时,r的值应该是153.
这可能是什么问题?有任何想法吗?
[代码块13.12,GCC 4.7.1-32位MinGW]
[我的电脑在Windows 8.1 Pro 64位上运行]
[在其他IDE上测试了代码,工作了。也通过终端和Xcode使用GCC在OS X上试用,工作]
答案 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