课后自主练习 (进制)1005. 八进制小数 hard(待完善)《编程思维与实践》个人学习笔记

题目

在这里插入图片描述

解题思路

受限于C++的精度显示,所以得开一个数组来储存每一位的确切数字来进行解决
两种思路
①:设置一个高精度的加法计算,然后将输入的八进制数字从后往前×0.125的n次方再进行累加,储存
如0.123
可以表示成 3 ∗ 8 − 3 + 2 ∗ 8 − 2 + 1 ∗ 8 − 1 3*8^{-3} + 2*8^{-2}+1*8^{-1} 383+282+181
②:循环嵌套:
比如0.123的八进制转换可以写成
( ( 3 / 8 + 2 ) / 8 + 1 ) / 8 ((3/8+2)/8+1)/8 ((3/8+2)/8+1)/8
在实现除以8的时候,我们可以考虑模拟竖式计算
在这里插入图片描述

法一:高精度计算

(待补充)

法二:嵌套循环

#include<iostream>
#include<string>
using namespace  std;


void trans(int q)
{

    
    string Octal;
    char decimal[1000];
    /*
    ①   八进制转换十进制时
        从后往前,每次取出每一位的数(8)
        将其与上一次除法运算得到的商相加
        再除以8
    */
    cin >> Octal;
    int num;//记录十位数
    int len = Octal.length() - 1;
    int Dlen = 0;//记录十进制数的位数

    for(; len != 1; len--)
    {
        num = Octal[len] - '0';
        int digit = 0;//记录mod之后的数
        int j = 0;//从前往后
        do
        {
            int temp;
            if(j < Dlen)
            {
                temp = num * 10 + decimal[j] - '0';
            }
            else
            {
                temp = num * 10;
                //后面没有存放的数据了,只能继续往后借0
            }
            digit = temp % 8;
            decimal[j++] = temp / 8 +'0';//别忘了j是要往后一位的,然后你是字符别忘记加0
            num = digit;
        }
        while(digit || j < Dlen);
        Dlen = j;//更新十进制的位数
    }
    
    cout << "case #" << q << ":" << endl <<"0.";
    for(int i = 0; i < Dlen; i++)
    {
        cout << decimal[i];
    }
    cout << endl;
}

int main()
{
    int total;
    cin >> total;
    for(int i = 0; i < total; i++)
    {
        trans(i);
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值