列表

详情


面试题 05.02. 二进制数转字符串

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

示例1:

 输入:0.625
 输出:"0.101"

示例2:

 输入:0.1
 输出:"ERROR"
 提示:0.1无法被二进制准确表示

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string printBin(double num) { } };

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

上一题