Вот ссылка на проблему, которую я пытаюсь решить: 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
также.