错误项目Euler#8

时间:2014-10-07 16:21:22

标签: c

我正在Problem 8 of Project Euler工作,我必须从给定的1000位数字中找到13个连续数字的最大乘积。我将该数字存储在一个文本文件中,然后将其输入我的源代码中。我的代码编译并运行,但我的答案似乎不正确。任何人都可以帮我找出错误的位置吗?

这是我的代码:

#include <stdio.h>
int main()
{
  int x,ar[1000],i = 0,prod = 0,tmp=1;
  FILE* fp = fopen("file.txt","r");
  if (fp == NULL)
  {
   printf("error");
   return 1;
  }
  while((x = fgetc(fp)) != EOF)
  {
      ar[i] = x;
      i++;
  }
  /*for(int m =0;m<999;m++)
  {
    printf("%d",ar[m]);
  }*/
  for(int j =0;j <= 986;j++)
  {
      for(int k=j;k<j+13;k++)
      {
        tmp = tmp * ar[k];
      }
      if(tmp > prod)
      {
        prod = tmp;
      }
  }
  printf("%i",prod);
  return 0;
}

2 个答案:

答案 0 :(得分:3)

13个连续数字的乘积可能会超出您int使用的tmp范围。您需要支持更广范围的数据类型。也许64位像unsigned long long那样。

正如@deviantfan指出的那样,你正在阅读字符,而'0'作为一个字符与数字0不同。阅读有关ASCII的信息。

另一个问题是tmp的逻辑不正确:在每个13步循环后,您没有将其重新初始化为1

EDITED:

回复你的评论:我想在这种情况下,最好的解决方案是将数据作为字符读取,但之后你可以将ASCII转换为整数,例如:

while((x = fgetc(fp)) != EOF)
{
    // x - '0' does the conversion, 
    // e.g. the expression obtains 0 from '0' - '0', and 5 from '5' - '0'
    ar[i] = x - '0';
    i++;
}

答案 1 :(得分:2)

您正在使用数字字符的乘积,而不是它们所代表的数字。 &#39; 1&#39; != 1。