欧拉项目#8:C++错误的答案(为一个小的炮制输入给出正确的答案)

Project Euler #8: C++ incorrect answer (gives correct for a small cooked up input)

本文关键字:答案 一个 输入 项目 C++ 错误      更新时间:2023-10-16

我在欧拉项目(C++上(为问题 #8 编写了以下代码。请注意,p8_data.txt包含我从问题陈述中复制的数字。我仔细检查了每次从文件中读取时它确实采用了正确的数字(尽管不是所有 1000 位数字(。

#include <iostream>
#include <cmath>
#include <vector>
#include <fstream>
using namespace std; 
int get_max_product(vector<long long> digits_of_num){
// vector<int> product_digits(digits_of_num.size()-12);
long long max = 1;
int num_digits = 13; 
cout << digits_of_num.size() << endl;
for (int i=0; i <= digits_of_num.size()-num_digits; i++) {
long long prod = 1; 
for (int j=i; j < i+num_digits; j++){
prod *= digits_of_num[j];
// cout << j << endl;
}
if (prod > max){
max = prod;
}
}
return max; 
}
int main() {
// you don't really need the number, just the digits; 
// it treats the number in the file as characters
ifstream inpFile;
int num_digits = 1000;
vector<long long> digits(num_digits); 
char x;  
inpFile.open("p8_data.txt");
if (!inpFile){
cerr << "Unable to open the requested file" << endl;
}
int sum = 0;
while (inpFile >> x){
digits[sum] = (long long)x - 48;
cout << digits[sum] << " ";
sum++;
}
inpFile.close();
cout << "nThe program ended happily with ending index = " << sum << endl; 
long long max_product;
max_product = get_max_product(digits);
cout << max_product << endl;
return 1;
}

但是,由于某种原因,它给出了不正确的输出:2039787520.

我在提取数字(即(long long)x - 48)(long) x - '0'以及其他几个数字时尝试并测试了几种变体。我也尝试在取 13 个连续数字的乘积时输出j,但这也是预期的(987for 循环的最后一次迭代999(。

我通过整理一个python3代码得到了答案,但这个想法是练习C++

蟒:

import numpy as np 
import os 
from copy import deepcopy
import operator
def extract_digits(num):
digits = []
num = int(num)
while (num/10 > 0):
digits.append(deepcopy(num) % 10)
num //= 10
digits.reverse()
return digits
def get_max_product(arr):
max_prod = []
# print(arr.size-13+)
for i in range(len(arr) - 13):
max_prod.append(np.prod(arr[i:i+13]))
return max(max_prod)
with open('p8_data.txt') as rfil:
lines = rfil.readlines()
nums = []
for line  in lines:
nums.append(line.rstrip())
digits = []
for n in nums:
digits.extend(extract_digits(n))
# digits = np.array(digits)
print(get_max_product(digits))

这给出了23514624000哪个是正确的答案!

任何人都可以指出C++代码可能出现的问题吗?我知道这是一个基本问题,但任何帮助将不胜感激。

尝试long longlong等等,但我得到了相同的结果。

出于好奇,我尝试制作另一串数字(尽管要短得多(,即

135689898 12999

并针对此字符串运行上述C++代码,最大乘积为3个连续数字,输出确实729.我也检查了其他几个较短的字符串,但结果都是正确的。仅对于问题陈述,它才会产生不正确的答案。

问题出在函数原型上:

int get_max_product(vector<long long> digits_of_num)

您返回的是int而不是long long。将其更改为

long long get_max_product(vector<long long> digits_of_num)

或更好(C++14 或更高版本(

auto get_max_product(vector<long long> digits_of_num)
相关文章: