[每日一题]面试题 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”,否则返回转换后的二进制小数。