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;

}

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸡爱玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值