【题解】二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。

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

提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。


本地编译器

#include <stdio.h>
#include <string.h>

//翻转函数
void reserve(char* s);
//相加函数
char* addBinary(char* a, char* b);
//输出函数
void Printf(char* s);

int main(void){
    
    
    //初始化数据
    char a[] = "11";
    char b[] = "1";

    //调用函数
    addBinary(a, b);
}

void reserve(char* s){
    
    
    //获得数组长度
    int len = strlen(s);
    //对换翻转
    for(int i = 0; i < len / 2; i++){
    
    
        char t = s[i];
        s[i] = s[len - i - 1];
        s[len - i - 1] = t;
    }
}

char* addBinary(char* a, char* b){
    
    
    //翻转两个字符串数组
    reserve(a);
    reserve(b);

    //求出两个数组的长度
    int len_a = strlen(a);
    int len_b = strlen(b);

    int n = len_a > len_b ? len_a : len_b;
    int carry = 0, len = 0;

    //存储数组长度增加两个空间,一个是用来存储'\0',还有一个是用来存储逢二进一的那个增加的一
    char* ans = (char*)malloc(sizeof(char) * (n + 2));

    //这里要理解len++ 是先执行后++,所以++后的len 都是给下一个语句使用的
    for(int i = 0; i < n; ++i){
    
    
        //将两个同下标的数字字符相加
        //i < len_a :如果正确,继续判断a[i] 是否为'1',是则返回1,否则返回0
        //如果错误则返回0,相加不改变数值
        carry += i < len_a ? (a[i] == '1') : 0;
        carry += i < len_b ? (b[i] == '1') : 0;
        //如果carry > 2,代表上一次运算中有一个进一加到这次运算汇总,+'0' 是为了将数字改变成数字字符
        ans[len++] = carry % 2 + '0';
        //carry >= 2时,代表会留一个进一给下一次运算,< 2则代表将carry 初始化为0,没有进一给下一个
        carry /= 2;
    }

    //如果carry 为1 的话,证明需要进一
    if(carry){
    
    
        ans[len++] = '1';
    }
    //为数组赋上结束符号
    ans[len] = '\0';
    reserve(ans);

    //输出数据
    //printf("%s", ans);  //可以调用函数也可以直接使用printf()函数
    Printf(ans);
}

void Printf(char* s){
    
    
    int n = strlen(s);

    for(int i = 0; i < n; i++){
    
    
        printf("%c", s[i]);
    }
}

本月更新进度 6/15

创作不易,你的点赞是我最大的动力!!!
我们下次再见 end~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43776724/article/details/106918404