C语言while循环异常求助——CodeForces 1A题目调试问题
C语言while循环异常:无限循环与未初始化变量问题
原始代码问题
输入6 6 4时,输出结果在-8519971516809424873到0之间波动,正确答案应为4。原始代码如下:
#include <stdio.h> int main() { long long int lenX,lenY,cube,needX,needY,i,t = 0; scanf("%lld%lld%lld", &lenX,&lenY,&cube); while (needX <= lenX) { needX + cube; i++; } while (needY <= lenY) { needY + cube; t++; } printf("%lld\n",i*t); return 0; }
错误点分析
- 局部变量未初始化:
needX、needY、i都是局部变量,C语言中局部变量默认不会初始化为0或确定值,而是随机垃圾值。这导致循环条件needX <= lenX一开始就不可控,大概率进入无限循环。 - 循环体未更新变量:
needX + cube仅做加法运算,未将结果赋值回needX(正确写法为needX += cube或needX = needX + cube)。needX值永远不变,循环条件持续成立,直到变量溢出变为负数才退出,最终导致i和t溢出,输出随机负数。
修改后代码的问题
修改后的代码仍未解决核心问题,输出结果依然异常:
#include <stdio.h> int main() { long long int lenX,lenY,cube,needX,needY; scanf("%lld%lld%lld", &lenX,&lenY,&cube); while (needX*cube <= lenX) { needX = 574973; } while (needY*cube <= lenY) { needY = 4057348; } printf("%lld %lld %lld\n",needX*needY,needX,needY); return 0; }
错误点分析
- 变量仍未初始化:
needX和needY依旧是未初始化的局部变量,初始值为随机垃圾值。若初始值满足needX*cube <= lenX,会进入无限循环;若不满足,则直接跳过循环,needX保持垃圾值,最终输出异常结果。 - 循环逻辑错误:即使进入循环,赋值固定值后
needX*cube会远大于lenX,但由于初始值不确定,无法保证循环行为符合预期。
正确实现方案
方案1:数学计算(更高效)
直接通过除法向上取整计算方向上的数量,避免循环:
#include <stdio.h> int main() { long long int lenX, lenY, cube; scanf("%lld%lld%lld", &lenX, &lenY, &cube); // 向上取整计算X方向可容纳的数量 long long int countX = (lenX + cube - 1) / cube; // Y方向同理 long long int countY = (lenY + cube - 1) / cube; printf("%lld\n", countX * countY); return 0; }
方案2:while循环(符合初始思路)
正确初始化变量并在循环体中更新变量:
#include <stdio.h> int main() { long long int lenX, lenY, cube; scanf("%lld%lld%lld", &lenX, &lenY, &cube); long long int countX = 0; long long int currentX = 0; while (currentX <= lenX) { currentX += cube; countX++; } long long int countY = 0; long long int currentY = 0; while (currentY <= lenY) { currentY += cube; countY++; } printf("%lld\n", countX * countY); return 0; }
输入6 6 4时,两个方案都会输出正确结果4。
内容的提问来源于stack exchange,提问作者somebodywhoisnotyou
相关产品推荐
相关产品推荐

