十进制转二进制程序循环处理时出现异常数值的问题求助
问题分析与修复方案
你的代码存在几个关键错误,直接导致了后续测试用例的异常输出:
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
相关产品推荐
相关产品推荐

