【力扣面试】面试题 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、二进制的小数转换为十进制主要是乘以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