leetcode-67-二进制求和-C语言

给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。

**思路:
步骤一:把两个字符串进行反转
步骤二:(1)length=min(lengtha,lengthb),flag=0;
(2)在0~length-1范围进行逐位相加,并加上flag;
(3)如果需要进位,将flag=1,否则flag=0;
步骤三:(1)length_max=max(lengtha,lengthb);
(2)在length~length_max范围内进行逐位相加,方法同步骤2。
步骤四:将逐位相加的字符串进行逆序。

notice:

  1. 字符串结束标志’\0’,不结束会出现乱码;
  2. 声明新的指针需要分配内存,malloc函数调用时需在文件开头声明编译预处理的函数库stdlib.h;
  3. 字符‘1’和字符‘0’不能直接用加法运算,因为他们对应的ascll值并不是1和0;**

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char * addBinary(char * a, char * b);
    //初始化字符串数组a,b
    char a[100]="100";
    char b[100]="110010";
    char *c=(char *)malloc(sizeof(char)*100);
    //声明一个指针c,用来指向函数返回值
    c=addBinary(a, b);
    puts(c);
    return 0;
}
//输入两个数组,返回二进制和
//输入: a = "11", b = "1"
//输出: "100"
char * addBinary(char * a, char * b){
    //lengtha用来记录数组a的长度,lengthb用来记录数组b的长度,length用来记录数组a,b的最短长度
    int lengtha,lengthb,length,i,j,k,flag;
    //c用来接收a反转数组,d用来接收b的反转数组
    char *c=(char *)malloc(sizeof(char)*10000);
    char *d=(char *)malloc(sizeof(char)*10000);
    //e用来接收接收c,d和,f用来接收e的反转数组
    char *e=(char *)malloc(sizeof(char)*10000);
    char *f=(char *)malloc(sizeof(char)*10000);
    //计算a的长度
    for(lengtha=0;*(a+lengtha)!='\0';lengtha++);
    //a反转
    for(i=lengtha-1,j=0;i>=0;i--,j++)
        *(c+j)=*(a+i);
    *(c+j)='\0';
    //计算b的长度
    for(lengthb=0;*(b+lengthb)!='\0';lengthb++);
    //b反转
    for(i=lengthb-1,j=0;i>=0;i--,j++)
        *(d+j)=*(b+i);
    *(d+j)='\0';
    //falg用来记录两个对应字符相加是否需要进位,如果需要进位就置为1
    flag=0;
    //用length来记录a,b长度的最短值
    length = lengtha < lengthb ? lengtha : lengthb;
    //对0~length-1的字符求和
    for(i=0;i<length;i++)
    {
        if(*(c+i)=='1'&&*(d+i)=='1')
        {
            if(flag==1)
                *(e+i)='1';
            else
                *(e+i)='0';
            flag=1;//两个1相加肯定需要进1

        }
        else if(*(c+i)=='0'&&*(d+i)=='0'){
            if(flag==1)
                *(e+i)='1';
            else
                *(e+i)='0';
            flag=0;//两个0相加肯定不需要进1
        }else{
            if(flag==0)
            {
                    *(e+i)='1';
                    flag=0;
            }
            else{
                *(e+i)='0';
                flag=1;//前面进1,加这里的一个1,需要往后进1
            }
        }
    }
    //当两个字符串相等时
    if(lengtha==lengthb)
    {
        if(flag==0)
        {
            *(e+length)='\0';

        }
        else{
            flag=0;
            *(e+length)='1';
            *(e+length+1)='\0';
            i++;

        }
         for(i=i-1,j=0;i>=0;i--,j++)
            *(f+j)=*(e+i);
        *(f+j)='\0';
        return f;
    }
     //当第二个字符串比第一个字符串长时,后面要考虑进位,不能完全照搬
    else if(lengtha<lengthb)
    {

        for(i=length; i<lengthb; i++)
        {
            //如果前面无进位,后面全部直接进行复制
            if(flag==0)
            {
                *(e+i)=*(d+i);

            }
            else
            {
                if(*(d+i)=='1')
                {
                    *(e+i)='0';
                    flag=1;
                }
                else
                {
                    *(e+i)='1';
                    flag=0;
                }

            }
        }
    }
    //当第一个字符串比第二个字符串长时,后面要考虑进位,不能完全照搬
    else
    {
        for(i=length; i<lengtha; i++)
        {
            if(flag==0)
            {
                *(e+i)=*(c+i);

            }
            else
            {
                if(*(c+i)=='1')
                {
                    *(e+i)='0';
                    flag=1;
                }
                else
                {
                    *(e+i)='1';
                    flag=0;
                }

            }
        }
    }
    //如果到最后max(lengtha,lengthb)-1那一位还需要进位,就需要把e长度+1
    if(flag==1)
    {
        *(e+i)='1';
        *(e+i+1)='\0';
        i++;
    }
    else
        *(e+i)='\0';
    //将字符串e逆置为f,注意以'\0'结束字符串,否则输出会出现乱码
    for(i=i-1,j=0; i>=0; i--,j++)
        *(f+j)=*(e+i);
    *(f+j)='\0';
    return f;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值