Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d05dc03

Browse files
committed
feat: add solutions to lc problem: No.0371
No.0371.Sum of Two Integers
1 parent 312983b commit d05dc03

File tree

10 files changed

+168
-18
lines changed

10 files changed

+168
-18
lines changed

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

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,9 @@
5050
class Solution:
5151
def add(self, a: int, b: int) -> int:
5252
a, b = a & 0xffffffff, b & 0xffffffff
53-
s = carry = 0
5453
while b:
55-
s = a ^ b
5654
carry = ((a & b) << 1) & 0xffffffff
57-
a, b = s, carry
55+
a, b = a ^ b, carry
5856
return a if a < 0x80000000 else ~(a ^ 0xffffffff)
5957
```
6058

@@ -88,6 +86,23 @@ class Solution {
8886
}
8987
```
9088

89+
### **C++**
90+
91+
```cpp
92+
class Solution {
93+
public:
94+
int add(int a, int b) {
95+
while (b)
96+
{
97+
unsigned int carry = (unsigned int)(a & b) << 1;
98+
a = a ^ b;
99+
b = carry;
100+
}
101+
return a;
102+
}
103+
};
104+
```
105+
91106
### **JavaScript**
92107
93108
```js
@@ -106,10 +121,10 @@ var add = function (a, b) {
106121

107122
```go
108123
func add(a int, b int) int {
109-
if b == 0 {
110-
return a
111-
}
112-
return add(a ^ b, (a & b) << 1)
124+
if b == 0 {
125+
return a
126+
}
127+
return add(a^b, (a&b)<<1)
113128
}
114129
```
115130

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public:
3+
int add(int a, int b) {
4+
while (b)
5+
{
6+
unsigned int carry = (unsigned int)(a & b) << 1;
7+
a = a ^ b;
8+
b = carry;
9+
}
10+
return a;
11+
}
12+
};
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
func add(a int, b int) int {
2-
if b == 0 {
3-
return a
4-
}
5-
return add(a^b, (a&b) <<1)
2+
if b == 0 {
3+
return a
4+
}
5+
return add(a^b, (a&b)<<1)
66
}
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
class Solution:
22
def add(self, a: int, b: int) -> int:
33
a, b = a & 0xffffffff, b & 0xffffffff
4-
s = carry = 0
54
while b:
6-
s = a ^ b
75
carry = ((a & b) << 1) & 0xffffffff
8-
a, b = s, carry
9-
return a if a < 0x80000000 else ~(a ^ 0xffffffff)
6+
a, b = a^b, carry
7+
return a if a < 0x80000000 else ~(a ^ 0xffffffff)

‎solution/0300-0399/0371.Sum of Two Integers/README.md‎

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,80 @@
2323

2424
<!-- 这里可写通用的实现逻辑 -->
2525

26+
两数字的二进制形式 a,b ,求和 s = a + b ,a(i)、b(i) 分别表示 a、b 的第 i 个二进制位。一共有 4 种情况:
27+
28+
| a(i) | b(i) | 不进位的和 | 进位 |
29+
| ---- | ---- | ---------- | ---- |
30+
| 0 | 0 | 0 | 0 |
31+
| 0 | 1 | 1 | 0 |
32+
| 1 | 0 | 1 | 0 |
33+
| 1 | 1 | 0 | 1 |
34+
35+
观察可以发现,"不进位的和"与"异或运算"有相同规律,而进位则与"与"运算规律相同,并且需要左移一位。
36+
37+
- 对两数进行按位 `^` 异或运算,得到不进位的和;
38+
- 对两数进行按位 `&` 与运算,然后左移一位,得到进位;
39+
- 问题转换为求:"不进位的数 + 进位" 之和;
40+
- 循环,直至进位为 0,返回不进位的数即可(也可以用递归实现)。
41+
2642
<!-- tabs:start -->
2743

2844
### **Python3**
2945

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

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

50+
```python
51+
class Solution:
52+
def getSum(self, a: int, b: int) -> int:
53+
a, b = a & 0xffffffff, b & 0xffffffff
54+
while b:
55+
carry = ((a & b) << 1) & 0xffffffff
56+
a, b = a ^ b, carry
57+
return a if a < 0x80000000 else ~(a ^ 0xffffffff)
3458
```
3559

3660
### **Java**
3761

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

4064
```java
65+
class Solution {
66+
public int getSum(int a, int b) {
67+
return b == 0 ? a : getSum(a ^ b, (a & b) << 1);
68+
}
69+
}
70+
```
71+
72+
### **C++**
73+
74+
```cpp
75+
class Solution {
76+
public:
77+
int getSum(int a, int b) {
78+
while (b)
79+
{
80+
unsigned int carry = (unsigned int)(a & b) << 1;
81+
a = a ^ b;
82+
b = carry;
83+
}
84+
return a;
85+
}
86+
};
87+
```
4188
89+
### **Go**
90+
91+
```go
92+
func getSum(a int, b int) int {
93+
for b != 0 {
94+
s := a ^ b
95+
b = (a & b) << 1
96+
a = s
97+
}
98+
return a
99+
}
42100
```
43101

44102
### **...**

‎solution/0300-0399/0371.Sum of Two Integers/README_EN.md‎

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,53 @@
2828
### **Python3**
2929

3030
```python
31-
31+
class Solution:
32+
def getSum(self, a: int, b: int) -> int:
33+
a, b = a & 0xffffffff, b & 0xffffffff
34+
while b:
35+
carry = ((a & b) << 1) & 0xffffffff
36+
a, b = a ^ b, carry
37+
return a if a < 0x80000000 else ~(a ^ 0xffffffff)
3238
```
3339

3440
### **Java**
3541

3642
```java
43+
class Solution {
44+
public int getSum(int a, int b) {
45+
return b == 0 ? a : getSum(a ^ b, (a & b) << 1);
46+
}
47+
}
48+
```
49+
50+
### **C++**
51+
52+
```cpp
53+
class Solution {
54+
public:
55+
int getSum(int a, int b) {
56+
while (b)
57+
{
58+
unsigned int carry = (unsigned int)(a & b) << 1;
59+
a = a ^ b;
60+
b = carry;
61+
}
62+
return a;
63+
}
64+
};
65+
```
3766
67+
### **Go**
68+
69+
```go
70+
func getSum(a int, b int) int {
71+
for b != 0 {
72+
s := a ^ b
73+
b = (a & b) << 1
74+
a = s
75+
}
76+
return a
77+
}
3878
```
3979

4080
### **...**
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public:
3+
int getSum(int a, int b) {
4+
while (b)
5+
{
6+
unsigned int carry = (unsigned int)(a & b) << 1;
7+
a = a ^ b;
8+
b = carry;
9+
}
10+
return a;
11+
}
12+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
func getSum(a int, b int) int {
2+
for b != 0 {
3+
s := a ^ b
4+
b = (a & b) << 1
5+
a = s
6+
}
7+
return a
8+
}

‎solution/0300-0399/0371.Sum of Two Integers/Solution.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ class Solution {
22
public int getSum(int a, int b) {
33
return b == 0 ? a : getSum(a ^ b, (a & b) << 1);
44
}
5-
}
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def getSum(self, a: int, b: int) -> int:
3+
a, b = a & 0xffffffff, b & 0xffffffff
4+
while b:
5+
carry = ((a & b) << 1) & 0xffffffff
6+
a, b = a ^ b, carry
7+
return a if a < 0x80000000 else ~(a ^ 0xffffffff)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /