难度简单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));//因为最后要存放\0
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] = '\0';
Over(str);
return str;
}
补零法
char * addBinary(char * a, char * b){
int len_a = strlen(a),len_b = strlen(b);
int n = (len_a>len_b)?len_a+1:len_b+1;//+1是防止进位 提前预留出来的空间
char*str1,*str2,*str3;
str1 = (char*)malloc(sizeof(char)*(n+1));//加1 是因为\0还占一个空间
str2 = (char*)malloc(sizeof(char)*(n+1));
str3 = (char*)malloc(sizeof(char)*(n+1));
memset(str1,'0',sizeof(char)*(n+1));
memset(str2,'0',sizeof(char)*(n+1));
memset(str3,'2',sizeof(char)*(n+1));
str1[n-len_a] = '\0';
str2[n-len_b] = '\0';
strcat(str1,a),strcat(str2,b);
int carry = 0;
for(int i = n-1;i>=0;i--)
{
str3[i] = (str1[i]+str2[i]+carry-2*'0')%2+'0';
carry = (str1[i]+str2[i]+carry-2*'0')/2;
}
str3[n] = '\0';
free(str1);
free(str2);
if(str3[0] == '0' && strlen(str3)>1)
{
return &str3[1];//输出两个0 本来空间就为进1做出了准备 并且初始化成了0 所以会出现两个0 但是str3[1]后边紧跟'\0' 这样返回输出就会输出一个零
}
return str3;
}
方法都很好,看大家喜好了。
以上就是,该题的内容了,加油铁汁~