我的算法有什么问题?

What's wrong with my algorithm?

本文关键字:问题 什么 算法 我的      更新时间:2023-10-16

我正在解决一些在线数学测试,认为很难找到解决方案并将其放入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");
}

可能pow返回double导致浮点不准确。

相反,尝试

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

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

切中要害,更换

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

带有

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

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

pow从来没有被认为是不精确的,足以在这个琐碎的测试中进行任何舍入。

但在SO的问题中,似乎有一种倾向,即将c头拉到c++中并使用system("pause");,即使用的pow版本严重低于应有的准确性。因此,前两个答案(建议不要使用pow)可能是有效正确的。但这只是因为你的数学库出了问题,而不是因为pow的有效副本会变得那么糟糕。

因此,你可以找到一个更好的C++环境或更好的数学头,或者你可以围绕pow 副本中的缺陷开始一些严重的防御性编程

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