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回来