面试题 05.02. 二进制数转字符串

二进制数转字符串。给定一个介于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;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值