在C++中投影euler#8得到了错误的答案,这是uint_64值的最大值

Project euler #8 in C++ getting wrong answer that is somewhat maximum uint_64 value

本文关键字:这是 答案 uint 最大值 错误 投影 C++ euler#8      更新时间:2023-10-16

下面是我试图解决的问题的链接:https://projecteuler.net/problem=8.

我写了一个代码,当我计算从1到12(包括)个连续数字的乘积时,它似乎工作得很好。例如,我得到的12个相邻数字的最大乘积是1792336896,这似乎是合乎逻辑的,因为它小于9^12。

然而,当我把13而不是12放在代码中时,我得到的答案是18446744073195294960,这太离谱了。我已经看了这几天了,我就是看不出哪里出了问题。如果有人能调查一下,我将不胜感激。

这是我的代码:

#include <iostream>
#include <fstream>
using namespace std;
int numbers[1000];
string line;
string numb;
uint64_t product=0;
void convert(){
    for (int i = 0 ; i < numb.length() ; i++)
    {
        numbers[i] = numb[i] - '0';
    }
}
void calculate_lines(){
    int digits = 13;
    for (int i=0;i<numb.length()-digits;i++){
        int temp=1;
        for (int j=i;j<digits+i;j++){
            if (numbers[j] == 0){
                i+=digits;
                break;
            }
            temp=temp*numbers[j];
        }
        if (temp>=product){
            product=temp;
        }
    }

}
void read_lines(){
    ifstream infile;
    infile.open("numbers.txt");
    if (infile.is_open())
    {
        while (getline(infile,line))
        {
            numb+=line;
        }
    infile.close();
    }
}
int main()
{
    read_lines();
    convert();
    calculate_lines();
    cout << product << endl;
    return 0;
}

使用变量int temp计算乘积。它不够大,无法包含13位数字的乘积,因此溢出。它变为负值,当转换为uint64_t时,它后来变为非常大的正值。

虽然保存最终结果product的变量是uint64_t,但您需要确保中间值存储在足够大的变量中。你也需要temp成为uint64_t