算法从简单开始 - 正小数的进制转换

题目

给定一个十进制的正小数转换为二进制的正小数(小数点保留 10 位)

解答

我们在做十进制正整数转换为二进制正整数时,采用短除法来计算,同样的正小数的进制间转换也是相同方法,参考文章1 参考文章2

我们获取正小数的整数部分和小数部分,整数部分的转换同 transform_pos_int 处理,小数部分的转换同 transform_pos_decimal 处理

// 十进制转二进制
void transform_pos_int(int src) {
    int mod;
    int left = src;
    vector<int> vec;
    while (left > 0) {
        mod = left % 2;
        left = left / 2;
        vec.insert(vec.begin(), mod);
    }
    for (auto x : vec) {
        std::cout << x;
    }
}

void transform_pos_decimal(double src) {
    const int SIZE = 10;
    vector<int> vec(0, SIZE);
    int idx = 0;
    while (SIZE > idx) {
        src *= 2.0F;
        vec.push_back(static_cast<int>(src));
        src -= vec[idx];
        idx++;     
    }
    for (auto x : vec) {
        std::cout << x;
    }
}

int main()
{  
    double x;
    while (true) {
        // 0.0000009 < x < 1
        std::cin >> x;
        int a = static_cast<int>(x);
        double b = x - a;
        if (a > 0) {
        	transform_pos_int(a);
            std::cout << ".";
        }
        if (b > 0) {
           transform_pos_decimal(b);
           std::cout << std::endl;
        }  
    }
    return 0;
}

运行结果

1.25
1.0100000000
2.25
10.0100000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值