Project Euler No 45的代码不起作用

时间:2013-07-31 16:22:45

标签: c++

问题在于Project Euler #45

这是我为它写的代码:

#include <iostream>
#include <math.h>
using namespace std;

bool ispent (long num){
    long double x = (sqrt(24*num+1) + 1.0)/6.0;
    if (floor(x)==x) return true;
    else return false;
}

bool ishex (long num){
    long double x = (sqrt(8*num+1) + 1.0)/4.0;
    if (floor(x)==x) return true;
    else return false;
}

int main(){
    int i=286;
    while(true){
        long x = (i*(i+1))/2;
        if((ispent(x)) && (ishex(x))){
            cout << x;
            break;
        }
        i++;
    }
}

这给出了输出40755,而我需要下一个数字。可能是什么错误?

2 个答案:

答案 0 :(得分:3)

问题是使用平方根检查数字是五角形还是六边形是不精确的,因此测试将失败并且您将溢出x

要解决此问题,您可以使用更精确的类型,例如将long替换为unsigned long,甚至替换unsigned long long

答案 1 :(得分:0)

你正在溢出x的32位表示。如果你知道下一个x是1533776805,那么需要一个2x的中间值,它在3e9溢出有符号整数。您可以只是在无符号整数中使用它,但我会使用64位整数。 #include <stdint.h>,并对i和x使用int64_t。但我同意其他评论者的意见,对测试精确的双精度答案存在疑问