概述
67. 二进制求和
难度简单941收藏分享切换为英文接收动态反馈
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1" 输出:"100"
示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
本文主要介绍两种方法:翻转法和补零法
首先是翻转法,就是将两个字符串颠倒位置,因为低位在左边不好计算,所以将它翻转,相加之后再将其翻转
其次就是不翻转,也就是补零法,就是将两个二进制字符串,变为相同长度,诸位相加,放进新的数组里面。
其实两种
翻转法
void Over(char*s)
{
int len = strlen(s);
for(int i = 0;i < len / 2;i++)
{
char tmp = s[i];
s[i] = s[len-1-i];
s[len-1-i] = tmp;
}
}
char * addBinary(char * a, char * b)
{
Over(a),Over(b);
int len_a = strlen(a),len_b = strlen(b);
int n = (len_a>len_b)?len_a+1:len_b+1;//可能会产生进位
char*str = (char*)malloc(sizeof(char)*(n+1));//因为最后要存放
int j = n - 1;//控制循环终止
int carry = 0;
for(int i = 0;i < j;i++)
{
int n1 = (i>len_a-1)?0:a[i]-'0';
int n2 = (i>len_b-1)?0:b[i]-'0';
str[i] = (n1+n2+carry)%2+'0';
carry = (n1+n2+carry)/2;
}
if(carry != 0)
{
str[j++] = '1';
}
str[j] = '