【力扣】67. 二进制求和

题目描述

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = “11”, b = “1”
输出:“100”

示例 2:

输入:a = “1010”, b = “1011”
输出:“10101”

提示:

  • 1 <= a.length, b.length <= 104
  • a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成
  • 字符串如果不是 “0” ,就不含前导零

解题方法

  • C
void reserve(char* str)   // 翻转字符串
{
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++)
    {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

char* addBinary(char* a, char* b)
{
    int len_a = strlen(a), len_b = strlen(b);   // 获取字符串长度
    int max = fmax(len_a, len_b);               // 获取最大长度
    char* ans = (char*)malloc(sizeof(char) * (max + 2));  // 申请内存,包含进位和'\0'
    int carry = 0, len = 0;

    reserve(a);         // 翻转字符串
    reserve(b);

    for (int i = 0; i < max; ++i)
    {
        if(i < len_a)
        {
            if(a[i] == '1')
            {
                carry += 1;
            }
            else
            {
                carry += 0;
            }
        }

        if(i < len_b)
        {
            if(b[i] == '1')
            {
                carry += 1;
            }
            else
            {
                carry += 0;
            }
        }

        ans[len++] = carry % 2 + '0';   // 计算当前位
        carry /= 2;                     // 计算进位
    }

    if (carry)              // 判断是否还有进位
    {
        ans[len++] = '1';   // 进位
    }

    ans[len] = '\0';        // 末尾加'\0'

    reserve(ans);           // 字符串翻转

    return ans;
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hello阿尔法

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

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

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

打赏作者

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

抵扣说明:

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

余额充值