我正在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;
}
答案 0 :(得分:3)
13个连续数字的乘积可能会超出您int
使用的tmp
范围。您需要支持更广范围的数据类型。也许64位像unsigned long long
那样。
正如@deviantfan指出的那样,你正在阅读字符,而'0'
作为一个字符与数字0
不同。阅读有关ASCII的信息。
另一个问题是tmp
的逻辑不正确:在每个13步循环后,您没有将其重新初始化为1
。
回复你的评论:我想在这种情况下,最好的解决方案是将数据作为字符读取,但之后你可以将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。