-1

这是我要解决的问题的链接: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;
}
4

1 回答 1

2

您使用变量 计算产品int temp。这不够大,无法包含 13 位的乘积,因此会溢出。它变成一个负值,当转换为 时,它变成一个非常大的正值uint64_t

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

于 2014-11-03T15:54:53.570 回答