前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >408. 二进制求和

408. 二进制求和

作者头像
和蔼的zhxing
发布2018-09-04 13:18:56
4610
发布2018-09-04 13:18:56
举报

给定两个二进制字符串,返回他们的和(用二进制表示) 样例 a = 11 b = 1 返回 100 非常惭愧还不是自己想来的算法,注意到几点: 1.数字字符减去‘0’可以得到其对应的int值。 2.可以先都加上(无非加上得到0,1,2)然后逐位进行进位处理. 下面的程序就是这样的一种思路,这里发现一个自己没注意的点,导致一些数据通过不了,如果是三种或三种以上互斥的情况,要用if-else语句的话中间都要用else if,因为else值匹配离其最近的if。比如

if (case 1)
    {---- ; }
if(case 2)
{------;}
else 
{------;}
//这里的else就可能包含了case1的情况,如果在if里面返回函数值可能还觉察不到这个问题,但是如果知识一般的判断和处理数据,这个问题就很严重。

code:

  string addBinary(string &a, string &b) {
       int size_a=a.size();
       int size_b=b.size();
       if(size_a<=0||size_b<=0)
       {
           return string();
       }
        resortString(a);   //重排字符串使得低位在前
        resortString(b);
        string res;   //存放结果
        int i=0;
        int carry=0; //进位标志
        for(i=0;i<size_a&&i<size_b;i++)  //把相同的位先加上
        {
            res+='0'+(a[i]-'0')+(b[i]-'0');   //前面的那个‘0’保证加完还是字符
            
        }
        for(;i<a.size();i++)
        {
            res+=a[i];
        }
        for(;i<b.size();i++)
        {
            res+=b[i];
        }
        //到这里就都加上了,加完以后每一位上可能是0,1,2.
        //下面要处理进位了,
        for(i=0;i<res.size();i++)
        {
            int temp=res[i]-'0'+carry;   
            //这里是不同的情况,进位之后可能是2,或者3,也可能是1,0
            if(temp==2)   //进位之后本位是0了
            {
                carry=1;
                res[i]='0';   
               
            }
            else if(temp==3)   //进位之后本位是1,这个else特别重要,如果是这种好几种情况的话一定要每次都加上else
            {
                carry=1;
                res[i]='1';
            }
            else{
                carry=0;
                res[i]=temp+'0';  //不进位,两种情况,tem=1或者0,直接赋值就可以
            }
        }
        if(carry==1)  //如果最后一位还有进位,那么再加上一个1
        {
            res+='1';
        }
        resortString(res);
        return res;
        
        // write your code here
        
    }
    
    void resortString(string &a)    //重排字符串
    {
        for(int i=0;i<a.size()/2;i++)
        {
            swap(a[i],a[a.size()-1-i]);
        }
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.11.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档