题目描述
输入两个字符串a和b,字符串内容为二进制数字,求两个字符串相加的结果,加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效。示例如下:
/**
@param a = “1101”
@param b = “1100”
@return “11001”
*/
public String add(String a, String b){ }
输入描述:
输入两个字符串,如"1101", “1100”
输出描述:
11001
示例1
输入
1101 1100
输出
11001
思路:字符串求和等价于大数求和,采用四步走:
- 将字符转换为数字,即使用数组存储字符串,因为考虑进位需要将数组的长度+1
- 数组中对应下标的数字求和
- 计算进位
- 将数组转换为字符串
#include<iostream>
#include<string>
#include<vector>
using namespace std;
/**
* @param a = "1101"
* @param b = "1100"
* @return "11001"
*/
string add(string a, string b){
int la=a.length(),lb=b.length();
int l = la>lb?la+1:lb+1;//防止最高位有进位
vector<int> va(l,0);
vector<int> vb(l,0);
//1.字符转数字,a从最低位到最高位读取,va从0开始存
for(int m=0,i=la-1;i>=0;m++,i--)
{
va[m]=a[i]-'0';
}
for(int m=0,i=lb-1;i>=0;m++,i--)
{
vb[m]=b[i]-'0';
}
//2.对应位求和
for(int i=0;i<l;i++)
{
va[i]+=vb[i];
}
//3.计算进位
for(int i=0;i<l;i++)
{
if(va[i]>=2)
{
va[i+1]=va[i+1]+va[i]/2;
va[i]=va[i]%2;
}
}
string res="";
//从尾到头找到第一个非0数字,然后进行数字到字符串转换
int k;
for(int i=l-1;i>=0;i--)
{
if(va[i]==0)
continue;
else{
k=i;
break;
}
}
for(int i=k;i>=0;i--)
{
res+=to_string(va[i]);
}
return res;
}
int main()
{
string a,b;
cin>>a>>b;
string res = add(a,b);
cout<<res<<endl;
return 0;
}