问题描述
给定两个二进制字符串,返回他们的和(用十进制字符串表示)。输入为非空字符串且只包含数字 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;
}