面试题 05.02. 二进制数转字符串
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
示例1:
输入:0.625 输出:"0.101"
示例2:
输入:0.1 输出:"ERROR" 提示:0.1无法被二进制准确表示
提示:
"0."
这两位。6
位原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 1.9 MB, 提交时间: 2023-05-08 09:58:09
func printBin(num float64) string { sb := &strings.Builder{} sb.WriteString("0.") for sb.Len() <= 32 && num != 0 { num *= 2 digit := byte(num) sb.WriteByte('0' + digit) num -= float64(digit) } if sb.Len() <= 32 { return sb.String() } return "ERROR" }
python3 解法, 执行用时: 40 ms, 内存消耗: 16.1 MB, 提交时间: 2023-05-08 09:57:56
class Solution: def printBin(self, num: float) -> str: res = "0." while len(res) <= 32 and num != 0: num *= 2 digit = int(num) res += str(digit) num -= digit return res if len(res) <= 32 else "ERROR"
golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2023-05-08 09:57:38
func printBin(num float64) string { bin := &strings.Builder{} bin.WriteString("0.") for i := 0; i < 6; i++ { // 至多循环 6 次 num *= 2 if num < 1 { bin.WriteByte('0') } else { bin.WriteByte('1') num-- if num == 0 { return bin.String() } } } return "ERROR" }
java 解法, 执行用时: 0 ms, 内存消耗: 38.9 MB, 提交时间: 2023-05-08 09:57:24
class Solution { public String printBin(double num) { var bin = new StringBuilder("0."); for (int i = 0; i < 6; ++i) { // 至多循环 6 次 num *= 2; if (num < 1) bin.append('0'); else { bin.append('1'); if (--num == 0) return bin.toString(); } } return "ERROR"; } }
python3 解法, 执行用时: 40 ms, 内存消耗: 16.2 MB, 提交时间: 2023-05-08 09:57:12
class Solution: def printBin(self, num: float) -> str: s = ["0."] for _ in range(6): # 至多循环 6 次 num *= 2 if num < 1: s.append('0') else: s.append('1') num -= 1 if num == 0: return ''.join(s) return "ERROR"
golang 解法, 执行用时: 0 ms, 内存消耗: 1.9 MB, 提交时间: 2023-03-02 09:06:26
func printBin(num float64) string { a, k, s := 0.5, 1, 0.0 t := "0." for s != num { if num - s >= a { t += "1" s += a } else { t += "0" } k++ a *= 0.5 if k > 30 { return "ERROR" } } return t }
cpp 解法, 执行用时: 0 ms, 内存消耗: 6 MB, 提交时间: 2022-11-18 10:47:06
class Solution { public: string printBin(double num) { string ans = "0."; while (num != 0) { num *= 2; if (num >= 1) { //乘2后num>=1,说明此时整数部分为1,取完该整数部分1后,num接着利用的还是其小数部分,所以要减掉整数部分(即1) ans += "1"; num -= 1; } else { //小于1说明整数部分为0,取该整数部分0 ans += "0"; } if (ans.size() > 32) return "ERROR"; } return ans; } };
java 解法, 执行用时: 0 ms, 内存消耗: 38.6 MB, 提交时间: 2022-11-18 10:46:21
class Solution { public String printBin(double num) { String ans = "0."; while (num != 0) { num *= 2; if (num >= 1) { //乘2后num>=1,说明此时整数部分为1,取完该整数部分1后,num接着利用的还是其小数部分,所以要减掉整数部分(即1) ans += "1"; num -= 1; } else { //小于1说明整数部分为0,取该整数部分0 ans += "0"; } if (ans.length() > 32) return "ERROR"; } return ans; } }
python3 解法, 执行用时: 44 ms, 内存消耗: 15 MB, 提交时间: 2022-11-18 10:36:51
class Solution: def printBin(self, num: float) -> str: a = 0.5 k = 1 s = 0.0 t = '0.' while s != num: if num - s >= a: s = s + a t += '1' else: t += '0' k += 1 a = 0.5 ** k if k > 30: return "ERROR" return t