C语言实现Project Euler第11题运行无输出,求排查代码逻辑错误
问题分析与修复方案
程序无法输出/结果错误的核心原因
- 原因1:最大值比较的代码位置错误
你把和maxProduct比较的逻辑放在了内层循环的外面,内层循环会不断覆盖当前的乘积变量(比如horProduct),等内层循环跑完一整行/列之后,你拿到的只有当前行/列最后一组4个数字的乘积,中间所有计算过的乘积都没参与最大值比较,相当于绝大多数计算都白跑了。 - 原因2:编译器兼容问题导致编译失败
如果你用的是只支持C89标准的编译器,for循环头部直接定义int i、int j的写法是不合法的,C89要求所有变量必须定义在代码块的最开头,编译失败自然生成不了可执行文件,也就没有输出。 - 潜在问题:整数溢出风险
4个两位数相乘的最大值接近1e8,虽然32位int的上限是2e9暂时能装下,但更稳妥的做法是把乘积相关变量改为long long类型,避免后续扩展或者计算边界场景下溢出。
修复后的核心逻辑示例
把每个乘积计算完之后立刻和最大值比较,修改后的横向计算逻辑参考如下,其余三个方向逻辑同理修改即可:
// 横向乘积计算修复示例 for (int i = 0; i < 20; i++) { for(int j = 0; j < 17; j++) { horProduct = matr[i][j]*matr[i][j+1]*matr[i][j+2]*matr[i][j+3]; // 直接在内层循环里比较更新最大值 if(horProduct > maxProduct) { maxProduct = horProduct; } } }
如果是C89编译器兼容问题,把所有循环里的变量定义移到main函数开头的变量定义区域即可:
int main() { int i,j; int matr[20][20] = { ... }; // 其余变量定义 // 后续循环里直接用i、j不要重新定义 }
额外说明
你当前写的对角线向左的逻辑实际计算的是和向右对角线同方向的乘积,正确的向左下/左上对角线的遍历逻辑需要调整j的范围,不过这是结果正确性的问题,不影响程序输出。
内容的提问来源于stack exchange,提问作者DevLearner
相关产品推荐
相关产品推荐

