【力扣面试】面试题 05.02. 二进制数转字符串

【力扣面试】面试题 05.02. 二进制数转字符串

文章目录

题目

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

示例1:

输入:0.625
输出:“0.101”

示例2:

输入:0.1
输出:“ERROR”

提示:

0.1无法被二进制准确表示

解题思路

思路:

题目意思是让求小数的二进制形式,然后将该二进制以String字符串方式输出。

首先要弄清楚,小数十进制形式怎么转换为二进制。

借用百度经验的方法:

1、十进制的小数转换为二进制,主要是小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。例如十进制的0.125,要转换为二进制的小数。

在这里插入图片描述

2、转换为二进制,将小数部分0.125乘以2,得0.25,然后取整数部分0

在这里插入图片描述

3、再将小数部分0.25乘以2,得0.5,然后取整数部分0

在这里插入图片描述

4、再将小数部分0.5乘以2,得1,然后取整数部分1

在这里插入图片描述

5、则得到的二进制的结果就是0.001

1

小数二进制到十进制的转换。

1、二进制的小数转换为十进制主要是乘以2的负次方,从小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方等。例如二进制数0.001转换为十进制。

在这里插入图片描述

2、第一位为0,则0*1/2,即0乘以2负 一次方。

在这里插入图片描述
3、第二位为0,则0*1/4,即0乘以2的负二次方。

在这里插入图片描述
4、第三位为1,则1*1/8,即1乘以2的负三次方。

在这里插入图片描述

5、各个位上乘完之后,相加,01/2+01/4+1*1/8得十进制的0.125
在这里插入图片描述

为什么0.1不能够精确表示二进制数据?

2进制表示小数的时候只能够表示能够用1/(2^n)的和的任意组合
例如:
0.5能够表示,因为它可以表示成为1/2
0.75也能够表示,因为它可以表示成为1/2+1/(2^2)
0.875也能够表示,因为它可以表示成为1/2+1/(22)+1/(23)

但是0.1不能够精确表示,因为它补能够表示成为1/(2^n)的和的形式

class Solution0502 {
    public String printBin(double num) {

        StringBuilder ans = new StringBuilder("0.");

        while (num != 0) {
            num *= 2;
            if (num >= 1) {
                ans.append("1") ;
                num -= 1;
            } else {
                ans.append("0");
            }
            if (ans.length() > 32) {//如果不能表示为2进制形式
                return "ERROR";
            }
        }
        return ans.toString();
    }
}

在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bianry-number-to-string-lcci

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值