BinaryAdd

这个题真的是自己摔了好多跤才爬起来的。。。自己还是考虑问题不全面,在软件测试的时候,估计会摔得更惨。。。
一开始想两种方案,二进制加,后者转十进制加,然后转回二进制,心想二进制加还要reverse才好加,不然对不齐,于是十进制,结果溢出了,用最大的unsigned long long还是溢出,这个可是20位十进制啊。。。
所以这种题目设计的就不是用十进制加法,而是要自己去实现一个加法,考虑各种情况,就像int的 +一样。

于是开始考虑情况,需要forward表示进位,然后还有长度不一样多出的怎么办,而且首先要reverse的,这样才对得齐。。。
于是由一般的写起,a[i]+b[i]+forward-2 >= <0来判断是否进位,然后后面也forward变为0 1,相应的,=0的我已开始忘记赋了,只记得比较重要的,进位需要赋1.。。
长度超出了怎么办?一定不能越界,于是判断是否超出任意一个的长度,如果超出了,且有进位,还要注意,可能一直进位,所以不能直接append后面多出的,如果forward=0 就append,然后还有最后多出一个
进位还要单独加一个”1”。我主要是一开始没有想清楚就coding,然后后面一个一个改,还是弄了一会儿,另外指针后移是每一个都后移,其他的break,我已开始最后全部 if else case都写了++,最后里面分支有的又
写了++,这个也忘记了。感觉这个逻辑的复杂度不亚于atoi函数的。。。。

summary:forward=0 且至少一个越界,直接append后面多出的部分,因为后面不再进位(注意此处两个都越界可以放到其中任意一个里,因为substr() startpos如果长度超过了,则返回空串,刚好符合要求)
forward=1 且至少一个越界,区分拿一个越界,然后加上a[i]+foward 看是否有进位,i++(这里两个都越界要单独处理,因为访问b[i]会越界,不想substr()能够tackle这种case,然后看如果进位,直接+”1”)
都不越界(forward=0 1可以统一起来), 普通处理
附上代码:

string addBinary(string a, string b)
    {
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        int forward=0,i=0;
        string c="";
        while(1)
        {
            if(forward==0 && (i>= a.size() || i>= b.size()))
            {
                if(i>= a.size())
                {
                    c+=b.substr(i);
                }
                else if(i>= b.size())
                    c+=a.substr(i);
                break;
            }
            else if(forward==1 && (i>= a.size() || i>= b.size()))
            {
                if(i>=a.size() && i< b.size())
                {
                    if(b[i]-'0'+forward>=2)
                    {

                        c+=char(b[i]-'0'+forward-2+'0');
                        forward=1;
                    }
                    else
                    {
                        c+=char(b[i]-'0'+forward+'0');
                        forward=0;

                    }
                    i++;
                }
                else if(i>=b.size() && i< a.size())
                {
                    if(a[i]-'0'+forward>=2)
                    {

                        c+=char(a[i]-'0'+forward-2+'0');
                        forward=1;
                    }
                    else
                    {
                        c+=char(a[i]-'0'+forward+'0');
                        forward=0;

                    }
                    i++;
                }
                else if(i>=b.size() && i>= a.size())
                {
                    c+="1";
                    break;

                }

            }
            else if(i<a.size()&&i<b.size())
            {
                if(a[i]-'0'+b[i]-'0'+forward>=2)
                {

                    c+=char(a[i]-'0'+b[i]-'0'+forward-2+'0');
                    forward=1;
                }
                else
                {
                    c+=char(a[i]-'0'+b[i]-'0'+forward+'0');
                    forward=0;
                }
                i++;
            }

            //i++;
        }
        reverse(c.begin(),c.end());
        return c;
    }

记得最后要reverse回来

Posted by richard爱闹 - 7月 19 2014
如需转载,请注明: 本文来自 Richard