C++ Euler 45号项目代码不起作用

C++ Euler 45号项目代码不起作用,c++,C++,问题是 下面是我为它编写的代码: #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){ lo

问题是

下面是我为它编写的代码:

#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++;
    }
}
#包括
#包括
使用名称空间std;
bool ispent(长数值){
长双x=(sqrt(24*num+1)+1.0)/6.0;
if(floor(x)=x)返回true;
否则返回false;
}
布尔ishex(长数值){
长双x=(sqrt(8*num+1)+1.0)/4.0;
if(floor(x)=x)返回true;
否则返回false;
}
int main(){
int i=286;
while(true){
长x=(i*(i+1))/2;
如果((ispent(x))&&(ishex(x))){

cout问题在于,使用平方根检查数字是否为五边形或六边形是不精确的,因此测试将失败,您将溢出
x


要解决这个问题,您可以使用精度更高的类型,例如将
long
替换为
unsigned long
,甚至是
unsigned long

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



要解决这个问题,您可以使用更精确的类型,例如将
long
替换为
unsigned long
,或者甚至
unsigned long
您正在溢出x的32位表示形式。如果您知道下一个x是1533776805,则需要一个中间值2x,它在3e9溢出一个有符号整数。你可以用一个无符号整数来表示,但我会用一个64位整数来代替。
\include
,并对I和x使用int64\t。但我同意其他评论者的观点,测试精确的双精度答案有点可疑。你溢出了x的32位表示。如果你知道下一个x是1533776805,那么中间值2x是必需的,3e9溢出了一个有符号整数。你可以把它放在一个无符号整数中,但我会用一个64位整数来代替。
\include
,对I和x都使用int64\t。但是我同意其他的评论,测试精确的双精度有些可疑n答案

如果在找到的第一个匹配项时离开,则无法找到下一个数字。(第一个匹配项是示例中的数字)我不明白。为什么我从286开始时会遇到40755?当我运行你的代码时,我得不到40755,因为这是你从285开始时得到的。你可能没有运行你认为正在运行的可执行文件,而是在运行你的旧测试代码。@Peter你得到了什么答案?我厌倦了等待。但它已经运行了ning,并且绝对不输出40755如果您在找到的第一个匹配项时离开,则无法到达下一个数字。(第一个匹配项是示例中的数字)我不明白。为什么我从286开始时会遇到40755?当我运行你的代码时,我得不到40755,因为这是你从285开始时得到的。你可能没有运行你认为正在运行的可执行文件,而是在运行你的旧测试代码。@Peter你得到了什么答案?我厌倦了等待。但它已经运行了ning,绝对不输出40755x不能是40755,因为我从I=286开始,而x=40755发生在I=285。实际上,我根据下一个数字测试了
ispent
ishex
函数(问题的正确答案),它们都返回false。所以可能是溢出。我应该怎么做才能使其正确?下一个数字是1533776805。当我在
ishex
ispent
中输入这些值时,我的编译器返回1。更好的方法是认识到所有六边形数都是三角形数。另外,检查一个数字是否为hexago使用平方根的nal或五边形不是很好。如果所有计算都是整数,如
无符号长
,则更好。您可以动态生成下一个五边形数和六边形数(如果五边形数更小,则生成下一个五边形数),并进行整数比较。x不能是40755,因为我从I=286开始,而x=40755发生在I=285。实际上,我根据下一个数字测试了
ispent
ishex
函数(问题的正确答案),它们都返回false。所以可能是溢出。我应该怎么做才能使其正确?下一个数字是1533776805。当我在
ishex
ispent
中输入这些值时,我的编译器返回1。更好的方法是认识到所有六边形数都是三角形数。另外,检查一个数字是否为hexago使用平方根的nal或五边形不是很好。如果所有计算都是整数,如
无符号长
,则更好。您可以动态生成下一个五边形数和六边形数(如果五边形数更小,则生成下一个五边形数),并进行整数比较。或者不必费心于
,而使用
long
(毕竟,这就是它的用途。)或者不必费心于
,而使用
long
(毕竟,这就是它的用途。)