携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 29 天,点击查看活动详情
二进制数转字符串
原题地址
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为 double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印 “ERROR”。
示例1:
输入:0.625
输出:"0.101"
示例2:
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
提示:
- 32位包括输出中的 "0." 这两位。
- 题目保证输入用例的小数位数最多只有 6 位
思路分析
方法一
- 手动来转换二进制,小数转换成二进制的方法是 『乘2取整,顺序排列』;
- 因此每次将
num*2,将整数存储起来,剩下的小数部分继续乘以2运算,一直到最后结果为0; - 在计算过程中需要判断
res的长度是否超过30,若超过则返回ERROR,否则返回0.${res.join('')}。
方法二
- 使用
Number.toString()方法可以返回数字对应的字符串形式,该方法接收一个radix参数,该参数表示从数字到字符串转换的基数,如果未指定,则默认是为10。我们平常用的最多的就是不传参数,然后默认按照十进制的方式返回; - 了解了 API 后,我们可以将数字按照二进制的方式返回一个字符串;
- 题目中要求需要
32位以内的二进制数,因此需要小数点后面的字符串长度是否超过30,若超过则返回ERROR,否则返回对应的结果即可。
AC 代码
方法一
/**
* @param {number} num
* @return {string}
*/
var printBin = function(num) {
const res = []
while (num) {
num *= 2
const item = num >= 1 ? 1 : 0
res.push(item)
if (res.length > 30) return 'ERROR'
num -= item
}
return `0.${res.join('')}`
};
结果:
- 执行结果: 通过
- 执行用时:60 ms, 在所有 JavaScript 提交中击败了 61% 的用户
- 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了 55% 的用户
- 通过测试用例:33 / 33
方法二
/**
* @param {number} num
* @return {string}
*/
var printBin = function(num) {
const res = num.toString(2)
return res.split(".")[1].length > 30 ? 'ERROR' : res
};
结果:
- 执行结果: 通过
- 执行用时:60 ms, 在所有 JavaScript 提交中击败了60.61%的用户
- 内存消耗:41 MB, 在所有 JavaScript 提交中击败了18.18%的用户
- 通过测试用例:33 / 33