1000位数字的13个相邻数字的最大乘积

时间:2018-11-23 05:02:43

标签: c

我必须在下面找到1000个数字中13个相邻数字的最大乘积。我针对该问题的代码如下:

#include <stdio.h>

int main()
{
    char arr[1000] =
        "731671765313306249192251196744265747423553491949349698352031277450"
        "632623957831801698480186947885184385861560789112949495459501737958"
        "331952853208805511125406987471585238630507156932909632952274430435"
        "576689664895044524452316173185640309871112172238311362229893423380"
        "308135336276614282806444486645238749303589072962904915604407723907"
        "138105158593079608667017242712188399879790879227492190169972088809"
        "377665727333001053367881220235421809751254540594752243525849077116"
        "705560136048395864467063244157221553975369781797784617406495514929"
        "086256932197846862248283972241375657056057490261407972968652414535"
        "100474821663704844031998900088952434506585412275886668811642717147"
        "992444292823086346567481391912316282458617866458359124566529476545"
        "682848912883142607690042242190226710556263211111093705442175069416"
        "589604080719840385096245544436298123098787992724428490918884580156"
        "166097919133875499200524063689912560717606058861164671094050775410"
        "022569831552000559357297257163626956188267042825248360082325753042"
        "0752963450";

    int i, j;
    long int max;
    max = 0;
    long int s = 1;
    for (i = 0; i < 988; i++) {
        int a = 0;
        for (j = 1; j <= 13; j++) {
            printf("%c", arr[i + a]);
            s = s * arr[i + a];
            a++;
        }
        printf("%c%d", '=', s);
        printf("\n");
        if (s > max) {
            max = s;
        }
    }
    printf("\nMaximum product is %d", max);
    getchar();
}

即使输入都不为零,某些输出也为零。第二个输出恰好是负数。答案甚至不匹配。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

char数组arr中的许多13位数字集包含零,这就是为什么这些集相乘将得出0的原因。

您的代码有两个问题:

  • 您正在使用%d而不是%ld来打印long int。使用错误的转换说明符将导致不确定的行为。
  

如果任何参数都不是对应转换说明的正确类型,则行为未定义。

  • 您没有在乘法之前将数字的ASCII值转换为其实际值。 (ASCII值“ 0”为48)。这会导致整数溢出,并且是要打印负值的原因。

因此,声明:

s = s * arr[i + a];

应更改为:

s = s * (arr[i + a] - '0');
  • 您也不会在内部s循环的开始处将乘积for重置为1,因此,最终要乘以不同的13组结果乘以值。
  • li>

进行了这些更改之后,您可以观看实时演示here

答案 1 :(得分:2)

此代码中需要解决一些问题:

  • 清理空格和变量名(另一位用户的编辑帮助解决了此问题)。删除诸如a之类的冗余变量,j可以通过从0迭代到12而不是从1迭代到13来轻松表示。这看起来很漂亮,但实际上使您更容易理解程序状态,因此实际上关键。

  • 数值溢出:与所有PE问题一样,您将要处理非常大的数字,这可能会溢出long int数据类型的容量(2 31 -1) 。使用unsigned long long存储您的maxs(我称product)变量。使用%llu打印结果。

  • char转换为intarr[i+j] - '0';,以便您乘以char表示的实际数字而不是其ASCII值(高48)。

  • s(实际上是product)不会在内循环的每次迭代中重置,因此您要获取整个1000大小输入的乘积(或尝试直到您的int开始溢出)。