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

十进制转二进制程序循环处理时出现异常数值的问题求助

问题分析与修复方案

你的代码存在几个关键错误,直接导致了后续测试用例的异常输出:

1. 非法访问单个变量的数组下标

p是普通int变量,并非数组,但你在循环里写了p[z] % 2和p[z] /= 2——这属于非法内存访问,会读取到随机的内存垃圾值,最终引发异常输出。
修复方式:直接使用变量p,去掉错误的数组下标写法。

2. 输出循环逻辑混乱

原输出循环:

for(int x = a - 1; a >= 0; a--){
    printf("%d", rem[a]);
}

这里x被初始化后从未使用,循环条件与变量递减逻辑冲突,会导致循环多执行,甚至读取到rem数组里残留的旧测试用例数据。
修复方式:用x作为循环变量,从a-1递减到0,只遍历当前测试用例生成的二进制位。

3. 未处理输入为0的场景

当输入十进制数为0时,while(p > 0)循环不会执行,导致没有输出任何二进制位,不符合预期(0的二进制应为0)。

修复后的完整代码

#include <stdio.h>

int main ()
{
    int b;
    int p;
    int rem[100];
    
    scanf("%d", &b);
    
    for(int z = 0; z < b; z++){
        scanf("%d", &p);
        
        int a = 0;
        // 单独处理输入为0的情况
        if (p == 0) {
            rem[a++] = 0;
        } else {
            while(p > 0){
                rem[a] = p % 2;
                p /= 2;
                a++;
            }
        }
        
        printf("Case #%d: ", z+1);
        
        // 倒序输出二进制位
        for(int x = a - 1; x >= 0; x--){
            printf("%d", rem[x]);
        }
        printf("\n");
    }

    return 0;
}

修复说明

  • 移除了错误的p[z]写法,直接操作变量p,避免非法内存访问。
  • 修正输出循环逻辑,确保只输出当前测试用例生成的有效二进制位。
  • 新增输入为0的处理分支,保证0能正确输出二进制值。
  • 每次测试用例处理时a都会重置为0,避免rem数组残留之前的旧数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:30:15