在项目euler 8上得到错误的答案

时间:2014-08-28 11:28:30

标签: c

我已经尝试在C中实现第8个问题。它给出了连续4位数的正确答案,但给出了13个错误的答案。请帮帮我。

以下是问题陈述:

  

1000位数字中的四个相邻数字   最大的产品是9×9×8×9 = 5832。

     

73167176531330624919225119674426574742355349194934   96983520312774506326239578318016984801869478851843   85861560789112949495459501737958331952853208805511   12540698747158523863050715693290963295227443043557   66896648950445244523161731856403098711121722383113   62229893423380308135336276614282806444486645238749   30358907296290491560440772390713810515859307960866   70172427121883998797908792274921901699720888093776   65727333001053367881220235421809751254540594752243   52584907711670556013604839586446706324415722155397   53697817977846174064955149290862569321978468622482   83972241375657056057490261407972968652414535100474   82166370484403199890008895243450658541227588666881   16427171479924442928230863465674813919123162824586   17866458359124566529476545682848912883142607690042   24219022671055626321111109370544217506941658960408   07198403850962455444362981230987879927244284909188   84580156166097919133875499200524063689912560717606   05886116467109405077541002256983155200055935729725   71636269561882670428252483600823257530420752963450

     

找到1000位数字中的13个相邻数字   最好的产品。这个产品有什么价值?

这是我的代码

#include<stdio.h>

int main()
{

    int a[]={7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 0, 6, 2, 4, 9, 1, 9, 2, 2, 5, 1, 1, 9, 6, 7, 4, 4, 2, 6, 5, 7, 4, 7, 4, 2, 3, 5, 5, 3, 4, 9, 1, 9, 4, 9, 3, 4, 9, 6, 9, 8, 3, 5, 2, 0, 3, 1, 2, 7, 7, 4, 5, 0, 6, 3, 2, 6, 2, 3, 9, 5, 7, 8, 3, 1, 8, 0, 1, 6, 9, 8, 4, 8, 0, 1, 8, 6, 9, 4, 7, 8, 8, 5, 1, 8, 4, 3, 8, 5, 8, 6, 1, 5, 6, 0, 7, 8, 9, 1, 1, 2, 9, 4, 9, 4, 9, 5, 4, 5, 9, 5, 0, 1, 7, 3, 7, 9, 5, 8, 3, 3, 1, 9, 5, 2, 8, 5, 3, 2, 0, 8, 8, 0, 5, 5, 1, 1, 1, 2, 5, 4, 0, 6, 9, 8, 7, 4, 7, 1, 5, 8, 5, 2, 3, 8, 6, 3, 0, 5, 0, 7, 1, 5, 6, 9, 3, 2, 9, 0, 9, 6, 3, 2, 9, 5, 2, 2, 7, 4, 4, 3, 0, 4, 3, 5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5, 0, 4, 4, 5, 2, 4, 4, 5, 2, 3, 1, 6, 1, 7, 3, 1, 8, 5, 6, 4, 0, 3, 0, 9, 8, 7, 1, 1, 1, 2, 1, 7, 2, 2, 3, 8, 3, 1, 1, 3, 6, 2, 2, 2, 9, 8, 9, 3, 4, 2, 3, 3, 8, 0, 3, 0, 8, 1, 3, 5, 3, 3, 6, 2, 7, 6, 6, 1, 4, 2, 8, 2, 8, 0, 6, 4, 4, 4, 4, 8, 6, 6, 4, 5, 2, 3, 8, 7, 4, 9, 3, 0, 3, 5, 8, 9, 0, 7, 2, 9, 6, 2, 9, 0, 4, 9, 1, 5, 6, 0, 4, 4, 0, 7, 7, 2, 3, 9, 0, 7, 1, 3, 8, 1, 0, 5, 1, 5, 8, 5, 9, 3, 0, 7, 9, 6, 0, 8, 6, 6, 7, 0, 1, 7, 2, 4, 2, 7, 1, 2, 1, 8, 8, 3, 9, 9, 8, 7, 9, 7, 9, 0, 8, 7, 9, 2, 2, 7, 4, 9, 2, 1, 9, 0, 1, 6, 9, 9, 7, 2, 0, 8, 8, 8, 0, 9, 3, 7, 7, 6, 6, 5, 7, 2, 7, 3, 3, 3, 0, 0, 1, 0, 5, 3, 3, 6, 7, 8, 8, 1, 2, 2, 0, 2, 3, 5, 4, 2, 1, 8, 0, 9, 7, 5, 1, 2, 5, 4, 5, 4, 0, 5, 9, 4, 7, 5, 2, 2, 4, 3, 5, 2, 5, 8, 4, 9, 0, 7, 7, 1, 1, 6, 7, 0, 5, 5, 6, 0, 1, 3, 6, 0, 4, 8, 3, 9, 5, 8, 6, 4, 4, 6, 7, 0, 6, 3, 2, 4, 4, 1, 5, 7, 2, 2, 1, 5, 5, 3, 9, 7, 5, 3, 6, 9, 7, 8, 1, 7, 9, 7, 7, 8, 4, 6, 1, 7, 4, 0, 6, 4, 9, 5, 5, 1, 4, 9, 2, 9, 0, 8, 6, 2, 5, 6, 9, 3, 2, 1, 9, 7, 8, 4, 6, 8, 6, 2, 2, 4, 8, 2, 8, 3, 9, 7, 2, 2, 4, 1, 3, 7, 5, 6, 5, 7, 0, 5, 6, 0, 5, 7, 4, 9, 0, 2, 6, 1, 4, 0, 7, 9, 7, 2, 9, 6, 8, 6, 5, 2, 4, 1, 4, 5, 3, 5, 1, 0, 0, 4, 7, 4, 8, 2, 1, 6, 6, 3, 7, 0, 4, 8, 4, 4, 0, 3, 1, 9, 9, 8, 9, 0, 0, 0, 8, 8, 9, 5, 2, 4, 3, 4, 5, 0, 6, 5, 8, 5, 4, 1, 2, 2, 7, 5, 8, 8, 6, 6, 6, 8, 8, 1, 1, 6, 4, 2, 7, 1, 7, 1, 4, 7, 9, 9, 2, 4, 4, 4, 2, 9, 2, 8, 2, 3, 0, 8, 6, 3, 4, 6, 5, 6, 7, 4, 8, 1, 3, 9, 1, 9, 1, 2, 3, 1, 6, 2, 8, 2, 4, 5, 8, 6, 1, 7, 8, 6, 6, 4, 5, 8, 3, 5, 9, 1, 2, 4, 5, 6, 6, 5, 2, 9, 4, 7, 6, 5, 4, 5, 6, 8, 2, 8, 4, 8, 9, 1, 2, 8, 8, 3, 1, 4, 2, 6, 0, 7, 6, 9, 0, 0, 4, 2, 2, 4, 2, 1, 9, 0, 2, 2, 6, 7, 1, 0, 5, 5, 6, 2, 6, 3, 2, 1, 1, 1, 1, 1, 0, 9, 3, 7, 0, 5, 4, 4, 2, 1, 7, 5, 0, 6, 9, 4, 1, 6, 5, 8, 9, 6, 0, 4, 0, 8, 0, 7, 1, 9, 8, 4, 0, 3, 8, 5, 0, 9, 6, 2, 4, 5, 5, 4, 4, 4, 3, 6, 2, 9, 8, 1, 2, 3, 0, 9, 8, 7, 8, 7, 9, 9, 2, 7, 2, 4, 4, 2, 8, 4, 9, 0, 9, 1, 8, 8, 8, 4, 5, 8, 0, 1, 5, 6, 1, 6, 6, 0, 9, 7, 9, 1, 9, 1, 3, 3, 8, 7, 5, 4, 9, 9, 2, 0, 0, 5, 2, 4, 0, 6, 3, 6, 8, 9, 9, 1, 2, 5, 6, 0, 7, 1, 7, 6, 0, 6, 0, 5, 8, 8, 6, 1, 1, 6, 4, 6, 7, 1, 0, 9, 4, 0, 5, 0, 7, 7, 5, 4, 1, 0, 0, 2, 2, 5, 6, 9, 8, 3, 1, 5, 5, 2, 0, 0, 0, 5, 5, 9, 3, 5, 7, 2, 9, 7, 2, 5, 7, 1, 6, 3, 6, 2, 6, 9, 5, 6, 1, 8, 8, 2, 6, 7, 0, 4, 2, 8, 2, 5, 2, 4, 8, 3, 6, 0, 0, 8, 2, 3, 2, 5, 7, 5,3,0, 4, 2, 0, 7, 5, 2, 9, 6, 3, 4, 5, 0};
    int i,j,k;
    long long int s;
    s=1;
    for(i=0;i<=987;i++)
    {
        if(a[i]*a[i+1]*a[i+2]*a[i+3]*a[i+4]*a[i+5]*a[i+6]*a[i+7]*a[i+8]*a[i+9]*a[i+10]*a[i+11]*a[i+12]>=s)
            s=a[i]*a[i+1]*a[i+2]*a[i+3]*a[i+4]*a[i+5]*a[i+6]*a[i+7]*a[i+8]*a[i+9]*a[i+10]*a[i+11]*a[i+12];
    }

    printf("%lld\n",s);
    s=1;
    for(i=0;i<=996;i++)
    {
        if(a[i]*a[i+1]*a[i+2]*a[i+3]>=s)
            s=a[i]*a[i+1]*a[i+2]*a[i+3];
    }

    printf("%lld\n",s);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的代码给出了答案2091059712对吗?正确的答案是一个数量级。

你碰到整数溢出。

a[i] * a[i+1] * ....

计算为int,通常只有2-4个字节宽。 您正确地将结果存储为long int(在您的情况下为8个字节),但到那时为时已晚。

解决这个问题的方法是逐步计算产品。

long int product = 1; for ( j = 0; j < 13; j++ ) product *= a[i + j]; if ( s < = product ) s = product;

这样做的另一个好处是很多更容易阅读。

答案 1 :(得分:1)

这不是详尽的答案,而是指令,所以你可以重写你的代码,因为没有理智的人会调试它。

  • a存储在静态内存中。 这个东西是4兆字节,你很危险地接近(如果没有过去)破坏你的堆栈。这可以通过使a成为全局(将它放在{{1之外)来完成}),或静态local(声明为main)。声明它static int a[]也是个好主意。另外,给它一个有意义的名字。 编辑:证据证明我不知道如何计算。尽管如此,该阵列没有意义是一个可变的自动变量。

  • 循环可以帮您节省开支。你的整个const总是相同的术语,计数器从0到N.嘿,一个计数器,这就是一个循环可以做的,对吗?

  • 正确格式化代码。缩进和对齐有助于使代码片段可读。

修改:我试过了,结果应为a[i]*a[i+1]*a[i+2]*a[i+3]*...*a[i+N](23,514,624,000)。