我的算法出了什么问题?

时间:2015-12-28 23:06:45

标签: c++ math

我正在解决一些在线数学测试,并认为找到解决方案并将其放在devc ++的程序中太难了,我应该有 153,370,371,407, 但缺少solution 407.

以下是问题:数字153有一个有趣的属性。换句话说,它等于其数字立方体的总和:

 13 + 53 + 33 = 153 

370是另一个具有相同属性的数字。还有另外两个三位数的自然数,三个不同的数字,都小于500,具有相同的属性。找到他们。 这是我的程序

#include<iostream.h>
#include<math.h>

using namespace std;

int main() {
    int i,nr,a,b,c;
    for(i=100;i<=500;i++) {
        nr=i;
        c=i%10;
        b=i/10%10;
        a=i/10/10;
        if((pow(a,3)+pow(b,3)+pow(c,3))==nr) cout<<nr<<endl;
    }
    system("pause");
}

3 个答案:

答案 0 :(得分:1)

或许pow返回double会导致浮点不准确。

相反,请尝试

if(a*a*a + b*b*b + c*c*c == nr)
    cout ....

答案 1 :(得分:1)

([编辑]已解决,因为。主要是从部分代码中猜测问题,因为此时问题格式非常严格,并且由于某种原因而无法编辑。

浮点计算并不总是精确的,并且通常不建议比较浮点值是否相等。

到目前为止,替换

if((pow(a,3)+pow(b,3)+pow(c,3))==nr)

if((a*a*a + b*b*b + c*c*c) == nr)

答案 2 :(得分:0)

当我运行该程序时,我得到了这4个答案。

pow永远假设不够精确,无法在这个琐碎的测试中进行任何舍入。

但似乎有关于SO的问题倾向于将c标头拉入C ++并使用system("pause");使用pow的版本,其严重程度低于它应该是的。所以前两个答案(建议不使用pow的方法)可能是有效的。但只是因为你的数学库出了问题,而不是因为pow的有效副本变坏了。

所以你可以找到一个更好的C ++环境或更好的数学标题,或者你可以围绕你的pow

副本中的缺陷开始一些严谨的防御性编程

但是,如果这不能解决问题,那么接下来要怀疑的是endlpause之前无法正常工作。也许你看到一些输出缓冲问题。无论如何,我很确定代码很好(甚至使用pow),问题出在数学或I / O库函数中。