Add Binary

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

思路:

1、两个输入时字符串,要变成数字,最后返回字符串。

2、进位的问题,相加的时候,是否产生进位,进位标志表示,进位则是1,否则为0,

怎么判断进位,假设两个位置的数相加,若果 a+b>1表示进位了,所以我们可以用(a+b)/2表示,,

3、‘进位后的数字的表示,例如1+1=0;,,1+1+1=1; 因为二进制数是逢2进1,我们用(a+b)%2,,就可以得到进位后的数据

4、假设两个字符串的长度不一样,,两个字符串相加时产生的进位还对长的字符串有影响,在字符串的最后一位的时候,假设产生了进位,

则字符串的长度会增加,,这个怎么判断?  这是我们可以把进位的数直接加载字符串中。


主要是注意进位标志,,是否产生了进位。。。。

class Solution {
public:
    string addBinary(string a, string b) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int flag = 0;
        
        int aIndex = a.size() - 1;
        int bIndex = b.size() - 1;
        
        string c;
        
        while(aIndex >= 0 && bIndex >= 0)
        {
            int num = a[aIndex] - '0' + (b[bIndex] - '0') + flag;
            flag = num / 2;
            num %= 2;
            
            c = (char)(num + '0') + c;
            
            aIndex--;
            bIndex--;
        }
        
        while(aIndex >= 0)
        {
            int num = a[aIndex] - '0' + flag;
            flag = num / 2;
            num %= 2;
            
            c = (char)(num + '0') + c;
            
            aIndex--;
        }
        
        while(bIndex >= 0)
        {
            int num = b[bIndex] - '0' + flag;
            flag = num / 2;
            num %= 2;
            
            c = (char)(num + '0') + c;
            
            bIndex--;
        }
        
        if (flag > 0)
            c = (char)(flag + '0') + c;
            
        return c;
    }
};

public class Solution {
    public String addBinary(String a, String b) {
        int carry = 0;
        String s = "";
        int i, j;
        for (i = a.length() - 1, j = b.length() - 1; i >= 0 && j >= 0; i--, j--) {
            int sum = carry + a.charAt(i) - '0' + b.charAt(j) - '0';
            if (sum == 0) {
                s = '0' + s;
                carry = 0;
            } else if (sum == 1) {
                s = '1' + s;
                carry = 0;
            } else if (sum == 2) {
                s = '0' + s;
                carry = 1;
            } else {
                s = '1' + s;
                carry = 1;
            }
        }
 
        if (i >= 0)
            return prepend(s, a, i, carry);
        else if (j >= 0)
            return prepend(s, b, j, carry);
 
        if (carry == 1)
            return "1" + s;
 
        return s;
    }
 
    private String prepend(String s, String a, int i, int carry) {
        if (carry == 0)
            return a.substring(0, i + 1) + s;
 
        for (; i >= 0; i--) {
            if (carry == 1) {
                if (a.charAt(i) == '1') {
                    s = '0' + s;
                    carry = 1;
                } else {
                    s = '1' + s;
                    carry = 0;
                }
            } else {
                if (a.charAt(i) == '1') {
                    s = '1' + s;
                    carry = 0;
                } else {
                    s = '0' + s;
                    carry = 0;
                }
            }
        }
 
        if (carry == 1) {
            s = '1' + s;
        }
 
        return s;
    }
}

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string addbinary(string& a, string& b);

int main()
{
	string a = "111";
	string b = "11";
	string result = addbinary(a, b);
	cout << result << endl;


	system("pause");
	return 0;
}

string addbinary(string& a, string& b)
{
	int m = a.size()-1;
	int n = b.size()-1;
	int flag = 0;
	string temp;
	while (n>= 0 && m>= 0)
	{
		int num = a[m] - '0' + b[n] - '0' + flag;
		if (num > 1)
		{
			temp.insert(temp.begin(), (char)(num%2+'0'));
			flag = 1;
		}
		else
		{
			temp.insert(temp.begin(), (char)(num%2+'0'));
			flag = 0;
		}
		m--;
		n--;
	}

		while (m >= 0)
		{
			int num = a[m] - '0' + flag;
			temp.insert(temp.begin(), (char)(num%2+'0'));
			flag = num/2;
			m--;
		}
	

		while (n >= 0)
		{
			int num = b[n] - '0' + flag;
			temp.insert(temp.begin(), (char)(num%2 + '0'));
			flag = num / 2;
			n--;
		}
	

	if (flag)
		temp.insert(temp.begin(), (char)('1'));
	return temp;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值