Skip to content

Commit d1d9e4c

Browse files
committed
feat: add solutions to lcof problem: No.065
面试题65.不用加减乘除做加法
1 parent c9490c3 commit d1d9e4c

File tree

7 files changed

+62
-25
lines changed

7 files changed

+62
-25
lines changed

lcof/面试题65. 不用加减乘除做加法/README.md

+39-18
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,23 @@
2626

2727
<!-- 这里可写通用的实现逻辑 -->
2828

29-
两数字的二进制形式 a,b ,求和 s = a + b ,a(i)、b(i) 分别表示 a、b 的第 i 个二进制位。一共有 4 种情况:
29+
**方法一:位运算**
3030

31-
| a(i) | b(i) | 不进位的和 | 进位 |
32-
| ---- | ---- | ---------- | ---- |
33-
| 0 | 0 | 0 | 0 |
34-
| 0 | 1 | 1 | 0 |
35-
| 1 | 0 | 1 | 0 |
36-
| 1 | 1 | 0 | 1 |
31+
两数字 `a`,`b` 求和。
32+
33+
假设 $a_i$ 和 $b_i$ 分别表示 `a``b` 的第 $i$ 个二进制位。一共有 4 种情况:
34+
35+
| $a_i$ | $b_i$ | 不进位的和 | 进位 |
36+
| ----- | ----- | ---------- | ---- |
37+
| 0 | 0 | 0 | 0 |
38+
| 0 | 1 | 1 | 0 |
39+
| 1 | 0 | 1 | 0 |
40+
| 1 | 1 | 0 | 1 |
3741

3842
观察可以发现,“不进位的和”与“异或运算”有相同规律,而进位则与“与”运算规律相同,并且需要左移一位。
3943

40-
- 对两数进行按位 `^` 异或运算,得到不进位的和;
4144
- 对两数进行按位 `&` 与运算,然后左移一位,得到进位;
45+
- 对两数进行按位 `^` 异或运算,得到不进位的和;
4246
- 问题转换为求:“不进位的数 + 进位” 之和;
4347
- 循环,直至进位为 0,返回不进位的数即可(也可以用递归实现)。
4448

@@ -48,15 +52,15 @@
4852

4953
<!-- 这里可写当前语言的特殊实现逻辑 -->
5054

51-
由于 python `int` 是无限长整型,左移不会自动溢出,因此需要特殊处理。
55+
由于 Python `int` 是无限长整型,左移不会自动溢出,因此需要特殊处理。
5256

5357
```python
5458
class Solution:
5559
def add(self, a: int, b: int) -> int:
5660
a, b = a & 0xFFFFFFFF, b & 0xFFFFFFFF
5761
while b:
58-
carry = ((a & b) << 1) & 0xFFFFFFFF
59-
a, b = a ^ b, carry
62+
c = ((a & b) << 1) & 0xFFFFFFFF
63+
a, b = a ^ b, c
6064
return a if a < 0x80000000 else ~(a ^ 0xFFFFFFFF)
6165
```
6266

@@ -70,9 +74,9 @@ class Solution:
7074
class Solution {
7175
public int add(int a, int b) {
7276
while (b != 0) {
73-
int s = a ^ b;
74-
b = (a & b) << 1;
75-
a = s;
77+
int c = (a & b) << 1;
78+
a ^= b;
79+
b = c;
7680
}
7781
return a;
7882
}
@@ -84,7 +88,9 @@ class Solution {
8488
```java
8589
class Solution {
8690
public int add(int a, int b) {
87-
if (b == 0) return a;
91+
if (b == 0) {
92+
return a;
93+
}
8894
return add(a ^ b, (a & b) << 1);
8995
}
9096
}
@@ -97,9 +103,9 @@ class Solution {
97103
public:
98104
int add(int a, int b) {
99105
while (b) {
100-
unsigned int carry = (unsigned int)(a & b) << 1;
106+
unsigned int c = (unsigned int)(a & b) << 1;
101107
a = a ^ b;
102-
b = carry;
108+
b = c;
103109
}
104110
return a;
105111
}
@@ -115,7 +121,9 @@ public:
115121
* @return {number}
116122
*/
117123
var add = function (a, b) {
118-
if (b == 0) return a;
124+
if (b == 0) {
125+
return a;
126+
}
119127
return add(a ^ b, (a & b) << 1);
120128
};
121129
```
@@ -147,6 +155,19 @@ public class Solution {
147155
}
148156
```
149157

158+
### **TypeScript**
159+
160+
```ts
161+
function add(a: number, b: number): number {
162+
while (b) {
163+
const c = (a & b) << 1;
164+
a ^= b;
165+
b = c;
166+
}
167+
return a;
168+
}
169+
```
170+
150171
### **...**
151172

152173
```

lcof/面试题65. 不用加减乘除做加法/Solution.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ class Solution {
22
public:
33
int add(int a, int b) {
44
while (b) {
5-
unsigned int carry = (unsigned int)(a & b) << 1;
5+
unsigned int c = (unsigned int)(a & b) << 1;
66
a = a ^ b;
7-
b = carry;
7+
b = c;
88
}
99
return a;
1010
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
class Solution {
22
public int add(int a, int b) {
3-
if (b == 0) return a;
4-
return add(a ^ b, (a & b) << 1);
3+
while (b != 0) {
4+
int c = (a & b) << 1;
5+
a ^= b;
6+
b = c;
7+
}
8+
return a;
59
}
610
}

lcof/面试题65. 不用加减乘除做加法/Solution.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* @return {number}
55
*/
66
var add = function (a, b) {
7-
if (b == 0) return a;
7+
if (b == 0) {
8+
return a;
9+
}
810
return add(a ^ b, (a & b) << 1);
911
};

lcof/面试题65. 不用加减乘除做加法/Solution.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ class Solution:
22
def add(self, a: int, b: int) -> int:
33
a, b = a & 0xFFFFFFFF, b & 0xFFFFFFFF
44
while b:
5-
carry = ((a & b) << 1) & 0xFFFFFFFF
6-
a, b = a ^ b, carry
5+
c = ((a & b) << 1) & 0xFFFFFFFF
6+
a, b = a ^ b, c
77
return a if a < 0x80000000 else ~(a ^ 0xFFFFFFFF)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
function add(a: number, b: number): number {
2+
while (b) {
3+
const c = (a & b) << 1;
4+
a ^= b;
5+
b = c;
6+
}
7+
return a;
8+
}

solution/0600-0699/0687.Longest Univalue Path/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
**方法一:DFS**
48+
4749
相似题目:[543. 二叉树的直径](/solution/0500-0599/0543.Diameter%20of%20Binary%20Tree/README.md)
4850

4951
<!-- tabs:start -->

0 commit comments

Comments
 (0)