File tree Expand file tree Collapse file tree 1 file changed +21
-0
lines changed
Math/1073.Adding-Two-Negabinary-Numbers Expand file tree Collapse file tree 1 file changed +21
-0
lines changed Original file line number Diff line number Diff line change 1+ ### 1073.Adding-Two-Negabinary-Numbers
2+
3+ 此题的愿意是希望实现类似于K进制大数加法的算法。大数加法是说,两个加数特别大装不进内存的时候,就以数组的形式储存,然后逐位相加。
4+
5+ 本题的第一步可以实现一个普通的K进制大数相加的算法。然后将其中的进制K,改成-2进制即可,即:
6+ ``` cpp
7+ int sum = a+b+carry;
8+ int r = sum%(-2 );
9+ carry = sum/(-2 );
10+ ```
11+ 注意到C++中的除法运算是rounding towards zero,所以为了保证余数是正数,需要做修补:
12+ ``` cpp
13+ if (r<0 )
14+ {
15+ r+=abs(2);
16+ carrry+=1;
17+ }
18+ ```
19+ 此外,我们需要注意,对于普通的K进制相加(K为正数),M位数和M位数相加的结果最多可能是M+1位。但是对于K为负数的情况则不一定。比如说1(-2)+1(-2)=110(-2)。当算完第一次的sum之后,我们得到的carry=-1,说明我们还需要将-1做进一步的转化(为-2进制),而不能简单的把这个carry附加到结果的最高位。我们的解决方案是,将需要逐位相加的计算次数定义为:``` len=max(arr1.size(),arr2.size())+2 ``` ,其中+2就是为了应对上面的情况。显然,我们需要在arr1和arr2的最高位前做补零处理。
20+
21+ 当然,上面的操作同样会引入不必要的leading zeros,所以最终结果还需要排除掉这些先导零(除非结果本身就是0)。
You can’t perform that action at this time.
0 commit comments