14.LeetCode之二进制求和

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

输入为非空字符串且只包含数字 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; 
}

猜你喜欢

转载自blog.csdn.net/qq_39564672/article/details/88083620