我必须在下面找到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();
}
即使输入都不为零,某些输出也为零。第二个输出恰好是负数。答案甚至不匹配。任何帮助表示赞赏。
答案 0 :(得分:2)
char
数组arr
中的许多13位数字集包含零,这就是为什么这些集相乘将得出0的原因。
您的代码有两个问题:
%d
而不是%ld
来打印long int
。使用错误的转换说明符将导致不确定的行为。 如果任何参数都不是对应转换说明的正确类型,则行为未定义。
因此,声明:
s = s * arr[i + a];
应更改为:
s = s * (arr[i + a] - '0');
s
循环的开始处将乘积for
重置为1,因此,最终要乘以不同的13组结果乘以值。进行了这些更改之后,您可以观看实时演示here。
答案 1 :(得分:2)
此代码中需要解决一些问题:
清理空格和变量名(另一位用户的编辑帮助解决了此问题)。删除诸如a
之类的冗余变量,j
可以通过从0迭代到12而不是从1迭代到13来轻松表示。这看起来很漂亮,但实际上使您更容易理解程序状态,因此实际上关键。
数值溢出:与所有PE问题一样,您将要处理非常大的数字,这可能会溢出long int
数据类型的容量(2 31 -1) 。使用unsigned long long
存储您的max
和s
(我称product
)变量。使用%llu
打印结果。
将char
转换为int
:arr[i+j] - '0';
,以便您乘以char表示的实际数字而不是其ASCII值(高48)。
s
(实际上是product
)不会在内循环的每次迭代中重置,因此您要获取整个1000大小输入的乘积(或尝试直到您的int
开始溢出)。