长二进制字符串相加输出异常求助:LeetCode测试用例失败
超长二进制字符串相加错误的问题排查
问题根源
你的代码核心错误在于将超长二进制字符串通过atoi转换为long int时发生了溢出:
long int的存储容量有限(通常为32位,最大值仅为2147483647),而你提供的二进制字符串长度远超这个范围,转成十进制数值后会直接溢出,变成未定义的垃圾值(比如0),后续基于这些错误数值的计算自然会输出错误结果。- 另外,你把二进制字符串当成十进制数处理(用
%10和/10操作拆分每一位),这本身逻辑就错误——二进制的每一位是2的幂,不是10的幂,这种处理方式只适用于十进制数。
修复思路
正确的做法是直接操作二进制字符串的每一位,无需转换为整数,从最低位(字符串末尾)开始逐位相加并处理进位:
- 获取两个输入字符串的长度,从末尾开始遍历每一位。
- 逐位计算当前位的和(包含进位),得出当前位的结果和新的进位。
- 构建结果字符串时从后往前填充,最后处理剩余的进位。
- 结果字符串的长度需要考虑可能的额外进位(比最长输入字符串多1位)。
修复后的代码示例
#include <stdio.h> #include <stdlib.h> #include <string.h> char* addBinary(char* a, char* b) { int lenA = strlen(a); int lenB = strlen(b); int maxLen = lenA > lenB ? lenA : lenB; // 结果最多比最长字符串多1位(进位),额外加1存储终止符 char* result = (char*)malloc(sizeof(char) * (maxLen + 2)); if (!result) return NULL; int carry = 0; int idx = maxLen; result[idx + 1] = '\0'; // 先设置字符串终止符 // 从两个字符串的末尾开始遍历 lenA--; lenB--; while (lenA >= 0 || lenB >= 0 || carry > 0) { int sum = carry; // 累加当前位的数值(如果还有未处理的位) if (lenA >= 0) sum += (a[lenA--] - '0'); if (lenB >= 0) sum += (b[lenB--] - '0'); // 计算当前位结果和新的进位 result[idx--] = (sum % 2) + '0'; carry = sum / 2; } // 如果idx没有到0,说明前面有多余的空位,返回偏移后的指针 return result + idx + 1; }
代码说明
- 直接操作字符串的每一位,彻底避免了整数溢出问题,能处理任意长度的二进制字符串。
- 从字符串末尾开始计算,完全符合二进制加法从最低位开始的逻辑。
- 动态分配足够的内存存储结果,确保能容纳进位带来的额外位。
内容的提问来源于stack exchange,提问作者bl000m
相关产品推荐
相关产品推荐

