持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
面试题 05.02. 二进制数转字符串
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
「示例1:」
输入:0.625
输出:"0.101"
「示例2:」
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
「提示:」
32位包括输出中的 "0." 这两位。
题目保证输入用例的小数位数最多只有 6 位
解题思路
// 第一种
小数的二进制是每次乘2,取小数的部分,如果数为零停止,同时加入32这个终止条件
// 第二种
模拟手动将十进制小数转化为二进制
每次将num乘以2,将整数部分取出,剩下的小数部分继续进行同样操作。一直到num为0
还要判断小数数部分是否超过32个
// 第三种
这道题考察的是浮点数的二进制表示。整数部分我们是除二取余,而小数部分是乘二取整。这里就是不断对 num 做乘二取整的操作,一直到 str 长度超过 32 位,或者 num 变成 0。
// 第四种
res初始化为"0."
在满足位数要求的情况下,当num大于0时,循环
先将num乘以2,将乘积赋值给num
取num的个位(0或1),将对应的字符加入res的末尾
截取num的小数部分,作为num的新值
最后判断,当num为0时(即res已经精确地表达了num),返回res
否则,返回"ERROR"
二进制数转字符串!!
代码实现
// 第一种
/**
* @param {number} num
* @return {string}
*/
var printBin = function(num) {
let count = 1;
let res = "0."
while (num != 0) {
if (num * 2 >= 1) {
res = res + 1
num = num * 2 - 1
} else {
res = res + 0
num = num * 2
}
count += 1
if (count >= 32) {
res = "ERROR";
break;
}
}
return res;
};
// 第二种
const printBin = num => {
const digits = [];
while (num) {
num *= 2;
const digit = num >= 1 ? 1 : 0;
digits.push(digit);
if (digits.length > 32) return 'ERROR';
num -= digit;
}
return `0.${digits.join('')}`;
};
// 第三种
/**
* @param {number} num
* @return {string}
*/
var printBin = function(num) {
let str = '0.'
while (str.length < 32 && num !== 0) {
num *= 2
if (num >= 1) {
str += 1
num -= 1
} else {
str += 0
}
}
if (num === 0) {
return str
}
return 'ERROR'
};
// 第四种
var printBin = function(num) {
let res="0.";
if(num >= 1 || num<=0)return "ERROR";
let cnt=2;
while(num > 0){
num *=2;
dig=num>=1?1:0;
res+=dig;
cnt++;
num = num - dig;
if(num == 0)return res;
if(cnt >= 32)return "ERROR";
}
return "ERROR";
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;