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

长二进制字符串相加输出异常求助:LeetCode测试用例失败

超长二进制字符串相加错误的问题排查

问题根源

你的代码核心错误在于将超长二进制字符串通过atoi转换为long int时发生了溢出:

  • long int的存储容量有限(通常为32位,最大值仅为2147483647),而你提供的二进制字符串长度远超这个范围,转成十进制数值后会直接溢出,变成未定义的垃圾值(比如0),后续基于这些错误数值的计算自然会输出错误结果。
  • 另外,你把二进制字符串当成十进制数处理(用%10和/10操作拆分每一位),这本身逻辑就错误——二进制的每一位是2的幂,不是10的幂,这种处理方式只适用于十进制数。

修复思路

正确的做法是直接操作二进制字符串的每一位,无需转换为整数,从最低位(字符串末尾)开始逐位相加并处理进位:

  1. 获取两个输入字符串的长度,从末尾开始遍历每一位。
  2. 逐位计算当前位的和(包含进位),得出当前位的结果和新的进位。
  3. 构建结果字符串时从后往前填充,最后处理剩余的进位。
  4. 结果字符串的长度需要考虑可能的额外进位(比最长输入字符串多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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:40:41