[每日一题]面试题 05.02.二进制数转字符串

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

输入:0.625 输出:”0.101”

提示:

  • 32位包括输出中的 “0.” 这两位。
  • 题目保证输入用例的小数位数最多只有 6 位

Solution

class Solution {
    public String printBin(double num) {
        // 每次乘 2, 与 1 比较,大的该位就为 1(为 1 时减 1 后看是否为 0 来判断结束)
        String ans = "0.";
        // 定义次数
        int count = 0;
        // 32位包括输出中的 "0." 这两位
        while(count < 30){
            num = num * 2;
            if(num == 1){
                // 等于 1,该位为 1,并且返回
                ans = ans + "1";
                return ans;
            }else if(num > 1){
                // 大于 1,该位为 1 
                ans = ans + "1";
                num = num - 1;
            }else{
                // 小于1,该位为 0
                ans = ans + "0";
            }
            count++;
        }
        return "ERROR";
    }
}

Ideas

十进制小数转二进制小数的方法是:小数部分乘以 2,取整数部分作为二进制小数的下一位,小数部分作为下一次乘法的被乘数,直到小数部分为 0 或者二进制小数的长度超过 32 位。

我们不妨举个例子,比如说我们要将 0.8125 转换为二进制小数,过程如下:

0.8125×2=1.625取整数部分1 0.625×2=1.25取整数部分1 0.25×2=0.5取整数部分0 0.5×2=1取整数部分1

所以十进制小数 0.8125 的二进制小数表示为 0.1101(2) 。

对于本题,由于实数介于 0 和 1 之间,所以其整数部分一定是 0,我们只需要将小数部分,按照上述方法转换为二进制小数即可。当小数部分为 0 或者二进制小数的长度不小于 32 位时,停止转换。最后,如果小数部分不为 0,说明该实数无法用 32 位以内的二进制表示,返回字符串 “ERROR”,否则返回转换后的二进制小数。