卡在项目 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 #8 c++

Fancybox 卡在 IE 中加载 iframe

Docker错误:无效的参考格式

Project Euler 58: Spiral primes

模拟器无法启动,在将我的 Xcode 更新到 8.2.1 后卡在验证“模拟器”上

项目Euler#23 Python