File tree Expand file tree Collapse file tree 6 files changed +185
-2
lines changed
lcci/05.02.Bianry Number to String Expand file tree Collapse file tree 6 files changed +185
-2
lines changed Original file line number Diff line number Diff line change 24
24
25
25
<!-- 这里可写通用的实现逻辑 -->
26
26
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
+
27
50
<!-- tabs:start -->
28
51
29
52
### ** Python3**
30
53
31
54
<!-- 这里可写当前语言的特殊实现逻辑 -->
32
55
33
56
``` 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
35
66
```
36
67
37
68
### ** Java**
38
69
39
70
<!-- 这里可写当前语言的特殊实现逻辑 -->
40
71
41
72
``` 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
+ ```
42
104
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
+ }
43
122
```
44
123
45
124
### ** ...**
Original file line number Diff line number Diff line change 35
35
### ** Python3**
36
36
37
37
``` 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
39
47
```
40
48
41
49
### ** Java**
42
50
43
51
``` 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
+ ```
44
83
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
+ }
45
101
```
46
102
47
103
### ** ...**
Original file line number Diff line number Diff line change
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
+ };
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments