LeetCode刷题18--二进制求和

题目描述

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为非空字符串且只包含数字 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

猜你喜欢

转载自blog.csdn.net/baidu_41191295/article/details/113764019