You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:18:27