Java十进制转二进制代码故障排查:无法通过全部测试用例
十进制转二进制Java代码问题排查
你的代码存在三个关键问题,导致无法通过所有测试用例:
问题1:未处理输入为0的场景
当输入num=0时,while(num>0)循环不会执行,binary变量为空字符串,调用Integer.parseInt(binary)会直接抛出NumberFormatException,而0的二进制正确结果应该是0。
问题2:未处理负数输入
输入负数时,同样不满足num>0的循环条件,binary为空导致抛出异常,而负数的二进制需要以补码形式表示,代码完全没覆盖这种场景。
问题3:二进制数值超出int范围导致溢出
Java的int类型仅能表示32位有符号整数(最大值为2^31-1),当输入的十进制数对应的二进制字符串长度超过31位时,Integer.parseInt无法解析,会抛出数值溢出异常。比如输入2147483647,其二进制是31个1,转成int会直接溢出。
修正后的代码
考虑到二进制数的长度可能超出int范围,建议返回字符串类型来存储结果,同时覆盖0和负数的处理逻辑:
import java.util.Scanner; public class Converter { public static String toBinary(int num) { // 处理输入为0的情况 if (num == 0) { return "0"; } boolean isNegative = num < 0; // 负数先取绝对值处理,后续再转补码 if (isNegative) { num = -num; } String binary = ""; while (num > 0) { binary = (num % 2) + binary; num /= 2; } // 处理负数的补码转换 if (isNegative) { // 第一步:取反 StringBuilder complement = new StringBuilder(); for (char c : binary.toCharArray()) { complement.append(c == '0' ? '1' : '0'); } // 第二步:加1,处理进位 int carry = 1; StringBuilder result = new StringBuilder(); for (int i = complement.length() - 1; i >= 0; i--) { int digit = complement.charAt(i) - '0' + carry; result.insert(0, digit % 2); carry = digit / 2; } // 如果还有进位,补1 if (carry == 1) { result.insert(0, '1'); } // 补全到32位(int为32位有符号数) while (result.length() < 32) { result.insert(0, '1'); } return result.toString(); } return binary; } } public class Program { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); System.out.print(Converter.toBinary(x)); } }
内容的提问来源于stack exchange,提问作者paco
相关产品推荐
相关产品推荐

