0

这是问题所在,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,而我需要下一个数字。可能的错误是什么?

4

2 回答 2

3

问题是使用平方根来检查一个数字是五边形还是六边形是不精确的,所以测试会失败,你会溢出x

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

于 2013-07-31T16:24:58.593 回答
0

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

于 2013-07-31T16:58:02.823 回答