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

longこれを修正するには、unsigned long、またはに置き換えるなど、より精度の高い型を使用できますunsigned long long

于 2013-07-31T16:24:58.593 に答える