题目描述
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例:
输入: a = “11”, b = “1”
输出: “100”
示例:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
解题思路
string add(string s1,string s2)
{
string res;
int s1Len=s1.length();
int s2Len=s2.length();
//判斷兩個字符串哪個長,短的字符串前面補'0'
while(s1Len<s2Len)
{
s1='0'+s1;
s1Len++;
}
while(s1Len>s2Len)
{
s2='0'+s2;
s2Len++;
}
for(int i=s1.length()-1;i>0;i--)
{
s1[i]=s1[i]-'0'+s2[i];
if(s1[i]>'1')
{
s1[i]=(s1[i]-'0')%2+'0';
s1[i-1]=s1[i-1]+1;
}
}
s1[0]=s1[0]-'0'+s2[0];
if(s1[0]>'1')
{
s1[0]=(s1[0]-'0')%2+'0';
s1='1'+s1;
}
return s1;
}
int main()
{
string a="11";
string b="1";
string a1="1010";
string b1="1011";
cout<<add(a,b)<<endl;
cout<<add(a1,b1)<<endl;
return 0;
}
结果:
分析:
1.比较两个字符串,字符串短的前面补’0’,为了位数一致方便计算。
2.开始计算,反向遍历字符串1,字符串1的各个位置的值为字符串1和字符串2相加的值,注意,字符串相加对应其ASCII码值相加。
3.如果相加的值大于字符1的ASCII码值,表示需要进位。
4.进位时,当前位置字符为0,前一位需要+1。
5.遍历结束时,记录第一位的数值,如果第一位发生进位,那么,首位为字符0,前一位+1。
6.返回新的字符串1。
注意:
1.字符串相加为其对应的ASCII码值相加。
2.‘0’-‘0’=0
3.‘0’+1=‘1’
4.‘1’+0=‘1’
5.'0’的ASCII码为48,1的ASCII码为49