Add Binary

Add Binary


要求

**Given two binary strings, return their sum (also a binary string).

For example,

a = “11”

b = “1”

Return “100”.**

标签:数学,字符串


我的理解:

模拟二进制的加法


我的提交:

    char *addBinary(char *a, char *b) {
        int aptr = strlen(a)-1;
        int bptr = strlen(b)-1;

        int len = aptr >= bptr ? (aptr + 1):(bptr+1);

        int resultptr  = aptr>=bptr ? aptr:bptr;
        char *result = aptr>=bptr ? a:b;

        int carry=0,temp;
        while(aptr>=0 && bptr>=0)
        {
                temp = a[aptr--] -'0' + b[bptr--]-'0' + carry;
                result[resultptr--] = (temp & 1) + '0';//清除高位,如3,二进制数字11,我只需要01计算得数
                carry = temp >>1;//右移1位 <=> 除以2

        }

        while(resultptr>=0)
        {
                temp = result[resultptr] - '0' + carry;
                result[resultptr--] = (temp & 1) +'0';
                carry = temp >> 1;
        }


        if(carry >0)
        {
                char *ultimateResult = (char *)malloc((len+1) * sizeof(char));
                ultimateResult[0] = '1';
                ultimateResult[1] = '\0';

                result = strcat(ultimateResult,result);
        }
        return result;
    }

注意事项:

  • 使用两个int,aptr,bptr分别作 *a,*b的下标,并从后往前游,右端为二进制数的低位
  • 使用一个int,ptr做结果*result的游标
  • 使用一个int* result作结果,实质是指向*a,*b长度较长者,也方便多出位的运算
  • 使用carry作进位,初始为0
  • 1st 循环(条件:aptr>=0 && bptr>=0,即*a,*b都有位可相加)
    • 使用temp记录相加结果(原因同Plus One);又因为原数组中的数据为字符,所以运算与存放结果时应相应-‘0’与+’0’
    • 因运算为二进制:carry=temp/2;得数=temp%2(+’0’)
  • 2cd 循环
    • 原因:*a与*b中共同位相加完成后,长度较长者仍需运算
    • 条件:ptr>=0
    • ptr因此也是aptr或bptr
  • 检验最高位是否有进位(carry>0?)
    • 若有,则需在result的最高位处插入1

P.S:此解法可能由于参考了其他解法而导致有相似之处,感谢他们的分享!也欢迎各位学友都对我的解法的不足之处作出建议!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值