Skip to content

Commit 60e42cd

Browse files
committed
feat: add solutions to lcci problem: No.05.02
No.05.02.Bianry Number to String
1 parent 31fdeb7 commit 60e42cd

File tree

6 files changed

+185
-2
lines changed

6 files changed

+185
-2
lines changed

lcci/05.02.Bianry Number to String/README.md

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,101 @@
2424

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

27+
**方法一:十进制小数转二进制小数**
28+
29+
十进制小数转二进制小数的方法是:小数部分乘以 $2$,取整数部分作为二进制小数的下一位,小数部分作为下一次乘法的被乘数,直到小数部分为 $0$ 或者二进制小数的长度超过 $32$ 位。
30+
31+
我们不妨举个例子,比如说我们要将 $0.8125$ 转换为二进制小数,过程如下:
32+
33+
$$
34+
\begin{aligned}
35+
0.8125 \times 2 &= 1.625 \quad \text{取整数部分} \quad 1 \\
36+
0.625 \times 2 &= 1.25 \quad \text{取整数部分} \quad 1 \\
37+
0.25 \times 2 &= 0.5 \quad \text{取整数部分} \quad 0 \\
38+
0.5 \times 2 &= 1 \quad \text{取整数部分} \quad 1 \\
39+
\end{aligned}
40+
$$
41+
42+
所以十进制小数 $0.8125$ 的二进制小数表示为 $0.1101_{(2)}$。
43+
44+
对于本题,由于实数介于 $0$ 和 $1$ 之间,所以其整数部分一定是 $0$,我们只需要将小数部分,按照上述方法转换为二进制小数即可。当小数部分为 $0$ 或者二进制小数的长度不小于 $32$ 位时,停止转换。
45+
46+
最后,如果小数部分不为 $0$,说明该实数无法用 $32$ 位以内的二进制表示,返回字符串 `"ERROR"`,否则返回转换后的二进制小数。
47+
48+
时间复杂度 $O(C)$,空间复杂度 $O(C)$。其中 $C$ 为二进制小数的长度,最大为 $32$。
49+
2750
<!-- tabs:start -->
2851

2952
### **Python3**
3053

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

3356
```python
34-
57+
class Solution:
58+
def printBin(self, num: float) -> str:
59+
ans = '0.'
60+
while len(ans) < 32 and num:
61+
num *= 2
62+
x = int(num)
63+
ans += str(x)
64+
num -= x
65+
return 'ERROR' if num else ans
3566
```
3667

3768
### **Java**
3869

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

4172
```java
73+
class Solution {
74+
public String printBin(double num) {
75+
StringBuilder ans = new StringBuilder("0.");
76+
while (ans.length() < 32 && num != 0) {
77+
num *= 2;
78+
int x = (int) num;
79+
ans.append(x);
80+
num -= x;
81+
}
82+
return num != 0 ? "ERROR" : ans.toString();
83+
}
84+
}
85+
```
86+
87+
### **C++**
88+
89+
```cpp
90+
class Solution {
91+
public:
92+
string printBin(double num) {
93+
string ans = "0.";
94+
while (ans.size() < 32 && num != 0) {
95+
num *= 2;
96+
int x = (int) num;
97+
ans.push_back('0' + x);
98+
num -= x;
99+
}
100+
return num != 0 ? "ERROR" : ans;
101+
}
102+
};
103+
```
42104
105+
### **Go**
106+
107+
```go
108+
func printBin(num float64) string {
109+
ans := &strings.Builder{}
110+
ans.WriteString("0.")
111+
for ans.Len() < 32 && num != 0 {
112+
num *= 2
113+
x := byte(num)
114+
ans.WriteByte('0' + x)
115+
num -= float64(x)
116+
}
117+
if num != 0 {
118+
return "ERROR"
119+
}
120+
return ans.String()
121+
}
43122
```
44123

45124
### **...**

lcci/05.02.Bianry Number to String/README_EN.md

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,69 @@
3535
### **Python3**
3636

3737
```python
38-
38+
class Solution:
39+
def printBin(self, num: float) -> str:
40+
ans = '0.'
41+
while len(ans) < 32 and num:
42+
num *= 2
43+
x = int(num)
44+
ans += str(x)
45+
num -= x
46+
return 'ERROR' if num else ans
3947
```
4048

4149
### **Java**
4250

4351
```java
52+
class Solution {
53+
public String printBin(double num) {
54+
StringBuilder ans = new StringBuilder("0.");
55+
while (ans.length() < 32 && num != 0) {
56+
num *= 2;
57+
int x = (int) num;
58+
ans.append(x);
59+
num -= x;
60+
}
61+
return num != 0 ? "ERROR" : ans.toString();
62+
}
63+
}
64+
```
65+
66+
### **C++**
67+
68+
```cpp
69+
class Solution {
70+
public:
71+
string printBin(double num) {
72+
string ans = "0.";
73+
while (ans.size() < 32 && num != 0) {
74+
num *= 2;
75+
int x = (int) num;
76+
ans.push_back('0' + x);
77+
num -= x;
78+
}
79+
return num != 0 ? "ERROR" : ans;
80+
}
81+
};
82+
```
4483
84+
### **Go**
85+
86+
```go
87+
func printBin(num float64) string {
88+
ans := &strings.Builder{}
89+
ans.WriteString("0.")
90+
for ans.Len() < 32 && num != 0 {
91+
num *= 2
92+
x := byte(num)
93+
ans.WriteByte('0' + x)
94+
num -= float64(x)
95+
}
96+
if num != 0 {
97+
return "ERROR"
98+
}
99+
return ans.String()
100+
}
45101
```
46102

47103
### **...**
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
string printBin(double num) {
4+
string ans = "0.";
5+
while (ans.size() < 32 && num != 0) {
6+
num *= 2;
7+
int x = (int) num;
8+
ans.push_back('0' + x);
9+
num -= x;
10+
}
11+
return num != 0 ? "ERROR" : ans;
12+
}
13+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
func printBin(num float64) string {
2+
ans := &strings.Builder{}
3+
ans.WriteString("0.")
4+
for ans.Len() < 32 && num != 0 {
5+
num *= 2
6+
x := byte(num)
7+
ans.WriteByte('0' + x)
8+
num -= float64(x)
9+
}
10+
if num != 0 {
11+
return "ERROR"
12+
}
13+
return ans.String()
14+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public String printBin(double num) {
3+
StringBuilder ans = new StringBuilder("0.");
4+
while (ans.length() < 32 && num != 0) {
5+
num *= 2;
6+
int x = (int) num;
7+
ans.append(x);
8+
num -= x;
9+
}
10+
return num != 0 ? "ERROR" : ans.toString();
11+
}
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def printBin(self, num: float) -> str:
3+
ans = '0.'
4+
while len(ans) < 32 and num:
5+
num *= 2
6+
x = int(num)
7+
ans += str(x)
8+
num -= x
9+
return 'ERROR' if num else ans

0 commit comments

Comments
 (0)