题目:
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
示例1:
输入:0.625
输出:"0.101"
示例2:
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
提示:
32位包括输出中的 "0." 这两位。
题目保证输入用例的小数位数最多只有 6 位
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bianry-number-to-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
首先,我们要了解一个数学知识,小数如何从十进制转换成二进制。具体步骤如下所示:
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。
其次,我们开始对num进行循环,每一次都对num乘2,完后把他整数部分加入到最后结果的ans中,往后令num减去当前的整数部分。
最后,判断num是否能够转换成二进制,如果可以就返回最后结果ans,如果不可以,就返回ERROR。
代码:
class Solution {
public:
string printBin(double num) {
string ans;
ans.reserve(8);
ans += "0.";
for(int i = 0;i < 6 && num;i++)
{
num *= 2;
ans.push_back('0' + (int)num);
num -= (int)num;
}
return num ? "ERROR" : ans;
}
};