二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
示例1:
输入:0.625 输出:"0.101"
示例2:
输入:0.1 输出:"ERROR" 提示:0.1无法被二进制准确表示
提示:
- 32位包括输出中的
"0."
这两位。 - 题目保证输入用例的小数位数最多只有
6
位
思路:本题目简单地二进制转换问题
十进制的小数转换为二进制的方法为 十进制小数乘2,取出整数作为二进制小数第一位,余下的小数再乘以2,取出整数作为小数第二位,如此反复,直至余下的小数为0。
例:
十进制 0.375
0.375 * 2 = 0.75 ———— 0 (0.75的整数部分为0)
0.75 * 2 = 1.5 ———— 1(1.5的整数部分为1)
0.5 * 2 = 1 ———— 1(1的整数部分为1,且没有余数)
则二进制小数位 0.011
十进制 0.675
0.625 * 2 = 1.25 ———— 1(1.25的整数部分为1)
0.25 * 2 = 0.5 ———— 0(0.5的整数部分为0)
0.5 * 2 = 1 ———— 1(1的整数部分为1,且没有余数)
则二进制小数位 0.101
十进制 0.38
0.38 * 2 = 0.76 ———— 0(0.76的整数部分为0)
0.76* 2 = 1.52 ———— 1(1.52的整数部分为1)
0.52* 2 = 1.04 ———— 1(1.04的整数部分为1)
0.04*2 = 0.08 ———— 0 (0.08的整数部分为0)
.......
则二进制小数位 0.0110........
class Solution {
public:string printBin(double num) {string str ="0.";int sum = 0;while(sum<32&&num){num*=2;sum++;if(num>=1){str.push_back('1');num-=1;} else str.push_back('0');}return sum>=32?"ERROR":str;}
};