C语言——leetcode67——二进制求和

        

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));//因为最后要存放\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;

}

方法都很好,看大家喜好了。

以上就是,该题的内容了,加油铁汁~

你可能感兴趣的:(每日一题,c语言,javascript,前端)