-1

私が解決しようとしている問題へのリンクは次のとおりです: https://projecteuler.net/problem=8

1 から 12 (含まれる) の連続した数字の積を計算しているときに、うまくいくと思われるコードを書きました。たとえば、隣接する 12 桁の最大積は 1792336896 です。これは 9^12 より小さいため、論理的に見えます。

ただし、コードに 12 ではなく 13 を入れると、得られる答えは 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ですuint64_tが、中間値が十分な大きさの変数に格納されていることを確認する必要があります。あなたもそうである必要がありtempますuint64_t

于 2014-11-03T15:54:53.570 に答える