卡在项目 euler 的问题 8 上,得到错误的答案,但代码似乎正确
Posted
技术标签:
【中文标题】卡在项目 euler 的问题 8 上,得到错误的答案,但代码似乎正确【英文标题】:Stuck on problem 8 of project euler, getting wrong answer but the code seems right 【发布时间】:2020-03-25 10:53:15 【问题描述】:#include <bits/stdc++.h>
using namespace std ;
typedef long long LL ;
int main()
int arr[1000] = 0 ;
int k = 0 ;
string s ;
for (int i=0 ; i<20 ; i++)
cin >> s ;
for (int j=0 ; j<50 ; j++)
arr[k] = (int)(s[j]-'0') ;
k++ ;
long long int product = 1 , maxi = 0 ;
for (int i=0 ; i+12 < 1000 ; i++)
product = arr[i]*arr[i+1]*arr[i+2]*arr[i+3]*arr[i+4]*arr[i+5]*arr[i+6]*arr[i+7]*arr[i+8]*arr[i+9]*arr[i+10]*arr[i+11]*arr[i+12] ;
if (maxi < product)
maxi = product ;
cout << maxi << endl ;
return 0 ;
代码对我来说似乎很好,我一直得到 2091059712 输出,而问题正在拒绝。请问你能找出异常吗
【问题讨论】:
请注意,您不需要每次都执行所有乘法。参见例如here,就算是有点不要脸的插件,我都怕了。 【参考方案1】:您的数组元素是int
类型,因此它们的乘法是使用int
完成的——即使结果被分配给long long int
,这不会影响计算。这会导致溢出,因为在最坏的情况下,13 位数字的乘积可能高达 13^9 = 2541865828329,超过 INT_MAX
,这可能是 2^31 - 1。也许使用 long long int
作为数组类型,或者在相乘之前将元素转换为更大的 int 类型。
【讨论】:
谢谢,很有帮助。【参考方案2】:在你的代码really should be done using a loop中计算product
。
而不是这个:
product = arr[i]*arr[i+1]*arr[i+2]*arr[i+3]*arr[i+4]*arr[i+5]*arr[i+6]*arr[i+7]*arr[i+8]*arr[i+9]*arr[i+10]*arr[i+11]*arr[i+12] ;
试试这个:
for (product=arr[i], j=1; j<13; j++) product *= arr[i+j];
它不仅更短、更易于阅读、维护和调试,而且还可以避免导致程序给出错误答案的整数溢出错误。
在 C 中,将两个 int
变量相乘的表达式(如 arr[i]*arr[i+1]
)将生成 int
结果。如果此结果太大而无法放入 int
变量中(通常限制为 231−1,远小于 913),那么它将溢出你会得到错误的结果。
另一方面,如果将long long int
变量乘以int
变量(如product *= arr[i+j]
),则int
值将在执行计算之前提升为long long int
。这种行为称为“类型提升”。 You can read more about it here.
【讨论】:
@ANURAGBISHT 欢迎来到 SO;如果答案解决了您的问题,请接受(见What should I do when someone answers my question?以上是关于卡在项目 euler 的问题 8 上,得到错误的答案,但代码似乎正确的主要内容,如果未能解决你的问题,请参考以下文章
Project Euler 58: Spiral primes