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

C语言统计正整数最大数位右起位置出现次数的程序故障排查

C代码问题排查及修复

存在的问题

1. 数位位置计算逻辑错误

这是核心问题:现有代码没有独立维护当前遍历到的数位的位置索引,而是将结果位置的递增和「是否找到更大数位」绑定,导致无法正确获取当前数位的真实位置,最终统计错误。
举个错误例子:测试用例中的15926,各位从右到左依次为6(位置0)、2(位置1)、9(位置2)、5(位置3)、1(位置4),最大数位9在右2位置。现有代码执行时:

  • 处理位置0的6:大于初始max=0,pos变为1
  • 处理位置1的2:小于max=6,pos不变
  • 处理位置2的9:大于max=6,pos变为2
  • 后续数位都小于9,pos不变
    最终pos=2,会被switch语句错误映射到位置1的计数,和实际的位置2不符。

2. 输入循环判断逻辑错误

while (scanf("%d",&n))的判断存在漏洞:scanf读取失败时会返回0(匹配到非数值)或EOF(输入结束),其中EOF是值为-1的常量,属于非0值,会导致遇到输入结束时循环不会正常退出,触发未定义行为。

修复方案

  1. 新增独立的cur_pos变量记录当前遍历的数位位置,每处理一位就递增,只有找到更大的数位时才更新结果位置res_pos
  2. 修改循环条件为while (scanf("%d", &n) == 1),只有成功读取到1个整数时才继续循环
  3. 调整switch映射逻辑和结果位置直接对应,避免偏移错误

修复后代码

#include <stdio.h>

int main(){
    int n;
    int br0=0, br1=0, br2=0, br3=0, br4=0;
    // 只有成功读取1个整数时才继续循环
    while (scanf("%d",&n) == 1) {
        int max = 0;
        int num = n;
        int cur_pos = 0; // 记录当前遍历到的数位位置
        int res_pos = 0; // 记录最大数位的最终位置
        while (num > 0) {
            int digit = num % 10;
            if (digit > max) {
                max = digit;
                res_pos = cur_pos; // 直接赋值当前真实位置
            }
            num /= 10;
            cur_pos++; // 每处理一位,位置自增
        }
        // 按实际位置统计计数
        switch (res_pos) {
            case 0: br0++; break;
            case 1: br1++; break;
            case 2: br2++; break;
            case 3: br3++; break;
            case 4: br4++; break;
        }
    }
    printf("0: %d\n1: %d\n2: %d\n3: %d\n4: %d\n", br0, br1, br2, br3, br4);
    return 0;
}

内容的提问来源于stack exchange,提问作者itmemilan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:54:04