14.LeetCode之二进制求和

该博客讨论了如何在二进制字符串的基础上进行求和操作,不采用将字符串转换为十进制再相加的传统方法。而是直接通过C代码,利用字符到ASCII码的转换,实现二进制字符串的相加并处理进位问题,最终得到二进制形式的和。
摘要由CSDN通过智能技术生成

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0

示例 1:
输入: a = "11", b = "1"
输出: "100"

示例 2:
输入: a = "1010", b = "1011"
输出: "10101"

不推荐思路:字符串->二进制->十进制->相加->二进制 ->字符串

C代码:字符->ASCII码->相加->进位分析->ASCII码 ->字符->字符串(C语言中的字符串相当于字符数组,故 *(a+i) 相当于 a[i] )

#define max(a,b) ( (a>b) ? a:b )
char* addBinary(char* a, char* b) {
    int len_a = strlen(a); //不包括结束符'\0'的字符长度
    int len_b = strlen(b);
    int len = max( len_a, len_b)+1; //包括结束符'\0'
    char* ret = (char* )calloc( len+1, sizeof(char) ); //预先分配带进位的字符串的空间
    
    int i = len_a-1; //
    int j = len_b-1;
    int k = len-1;
    int carry = 0; //进位标志
    
    while( i>=0 || j>=0 ) //循环条件
    {
        int one = (i>=0) ? *(a+i)-'0':0; //字符位置右对齐(如100+1变为100+001)
        int two = (j>=0) ? *(b+j)-'0':0;
        int cur = one+two+carry;
        
        *(ret+k) = cur%2 + '0'; //二进制加法,保存二进制的ASCII码于ret[k]中
        carry = cur/2; //获得进位
        
        if(i>=0)
            i--;
        if(j>=0)
            j--;
        k--;
    }
    if( carry!=0 ) //最高位有进位,首地址的字符应置'1'
    {
        *ret = '1'; //相当于ret[0] = '1'
        return ret;
    }
    else //最高位没进位,故在申请的空间中,首地址的字符不属于生成字符串
        return ret+1; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值