Skip to content

Commit 8f11ca2

Browse files
authored
Create Readme.md
1 parent c9c3f8a commit 8f11ca2

File tree

1 file changed

+21
-0
lines changed
  • Math/1073.Adding-Two-Negabinary-Numbers

1 file changed

+21
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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)。

0 commit comments

Comments
 (0)