程序员面试金典 5.2

本文介绍了一种将[0,1]区间内的实数转换为二进制字符串的方法,若二进制长度超过32位则返回错误。通过不断乘2并判断结果是否大于等于1来决定二进制位的值,提供了两种实现方式。

Binary to String:给定一个[0, 1]之间的实数,用string返回其二进制表示,如果二进制表示长于32个字符,则返回ERROR

根据十进制转二进制的规则,对小数部分不断乘21即可。

class Solution {
private:
    const string strErr = "ERROR";
public:
    string printBin(double num) {
        if(num > 1.0 || num < 0.0){
            return strErr;
        }
        string strRet = "0.";
        while(num > 0.0){
            if(strRet.size() >= 34) return strErr;
            double r = num * 2;
            if(r >= 1.0){
                strRet.push_back('1');
                num = r - 1.0;
            }
            else{
                strRet.push_back('0');
                num = r;
            }
        }
        return strRet;
    }
};

也可以通过和0.50.250.125等比较大小来确定每一位的二进制表示。

class Solution {
private:
    const string strErr = "ERROR";
public:
    string printBin(double num) {
        if(num > 1.0 || num < 0.0){
            return strErr;
        }
        double fraction = 0.5;
        string strRet = "0.";
        while(num > 0.0){
            if(strRet.size() >= 34) return strErr;
            if(num >= fraction){
                strRet.push_back('1');
                num -= fraction;
            }
            else{
                strRet.push_back('0');
            }
            fraction /= 2.0;
        }
        return strRet;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值