C语言三层嵌套while循环无法输出勾股三元组,求错误原因
修复嵌套while循环实现勾股三元组输出的C代码错误
你的代码无法生成目标三元组,核心问题是内层循环变量没有在每次外层循环迭代时重置,另外还有可以优化的逻辑细节,具体分析和修正如下:
错误原因
- 循环变量未重置:
j和ij只在程序开头初始化了一次。第一次i=1的循环执行完后,j会变成251,ij也变成251。之后i递增到2时,while(j <= 250)的条件直接不成立,后续所有内层循环都不会运行,自然找不到任何符合条件的三元组。 - 无效循环过多:勾股定理里
a(对应你的ij)肯定是三个数里最大的,因为正整数的平方和等于另一个数的平方,a² = b² + c²意味着a必须大于b和c。原代码中ij从1开始遍历,会做大量不可能满足条件的判断。
修正后的代码
// 输出指定范围内的正整数勾股三元组 #include <stdio.h> int main(void) { unsigned int i = 1, j, ij; puts("\n***To calculate Pythag. triple integers...***\n"); while (i <= 250) { j = 1; // 每次i更新后,重置j为初始值 while (j <= 250) { // 让ij从i和j的较大值+1开始,跳过不可能的情况 ij = (i > j) ? (i + 1) : (j + 1); while (ij <= 250) { if (ij * ij == i * i + j * j) { printf("Candidate triple: (%u, %u, %u)\n", ij, i, j); } ++ij; } ++j; } ++i; } return 0; }
关键修改说明
- 重置循环变量:把
j的初始化移到i的循环内部,ij的初始化移到j的循环内部,确保每次外层循环开始时,内层变量都从正确的初始值重新遍历。 - 优化遍历范围:利用三元运算符让
ij直接从i和j中的较大值加1开始,避免对小于等于i或j的数值做无效判断,提升运行效率。 - 保留嵌套while结构:完全符合你要求的仅使用嵌套while循环的限制。
内容的提问来源于stack exchange,提问作者Vynylyn
相关产品推荐
相关产品推荐

