C++题解“55.二进制之和”| 豆包MarsCode AI刷题

100 阅读2分钟

问题描述

给定两个二进制字符串,返回他们的和(用十进制字符串表示)。输入为非空字符串且只包含数字 1 和 0 ,请考虑大数问题。时间复杂度不要超过 O(n^2),其中 n 是二进制的最大长度。

输入格式

每个样例只有一行,两个二进制字符串以英文逗号“,”分割

输出格式

输出十进制格式的两个二进制的和

输入样例

101,110

输出样例

11

数据范围

每个二进制不超过 100 个字符。

思路

需要将两个二进制字符串相加,并返回它们的十进制求和结果。由于二进制字符串可能非常长,常规的方法可能无法处理大数,因此需要自己写一个加法函数。

由于返回值要求是string所以这里用字符串模拟加法。

#include <iostream>
#include <string>
std::string add(std::string a,std::string b){
    int la=a.size(),lb=b.size();
    if(la<lb){               //由于字符串长度不同,统一处理成第一个字符串长度最大
        std::swap(la,lb);    
        std::swap(a,b);
    }
    int x=0,y=0;             //x为当前数位相加,y为进位
    int i,j;
    for(i=la-1,j=lb-1;j>=0;j--,i--){   //个位在字符串末尾,从末尾开始计算a+b,用a储存答案
        x=y+a[i]-'0'+b[j]-'0';
        y=x>9?1:0;
        x%=10;
        a[i]='0'+x;
    }
    while(y){                    //确保无多余的进位
        if(i<0){
            a='1'+a;
            break;
        }
        x=y+a[i]-'0';
        y=x>9?1:0;             //若x>9则进一位
        x%=10;
        a[i]='0'+x;
        i--;     
    }
    
    return a;
} 

std::string solution(std::string binary1, std::string binary2) {
    int a=binary1.size(),b=binary2.size();
    std::string x[101];         //使用string数组以十进制方式储存2的指数,x[i]为2的i次方
    x[0]='1';                   //初始化2的0次方
    
    //初始化x数组用于计算二进制字符串
    for(int i=1;i<=100;i++){     //2的i次方=2*2的i-1次方
        x[i]=add(x[i-1],x[i-1]);
        //std::cout<<x[i]<<std::endl;
    }
    
    std::string ans;
    
    //字符串末位为最低位,用j记录当前为2的几次方
    for(int i=a-1,j=0;i>=0;i--,j++){
        if(binary1[i]=='1')ans=add(ans,x[j]);
    }
    
    for(int i=b-1,j=0;i>=0;i--,j++){
        if(binary2[i]=='1')ans=add(ans,x[j]);
    }
    //std::cout<<ans<<std::endl;
    return ans;
}

int main() {
    // You can add more test cases here
    std::cout << (solution("101", "110") == "11") << std::endl;
    std::cout << (solution("111111", "10100") == "83") << std::endl;
    std::cout << (solution("111010101001001011", "100010101001") == "242420") << std::endl;
    std::cout << (solution("111010101001011", "10010101001") == "31220") << std::endl;

    return 0;
}