入门力扣自学笔记241 C++ (题目编号:面试题05.02)

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

题目:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值