DS队列+堆栈--数制转换 C++ 数据结构

目录

题目描述

思路分析

AC代码


题目描述

对于任意十进制数转换为k进制,包括整数部分和小数部分转换。整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换

整数部分19,					小数部分0.125
19 / 2 = 9 … 1					0.125 * 2 = 0.25 … 0
9 / 2 = 4 … 1					0.25 * 2 = 0.5   … 0
4 / 2 = 2 … 0 					0.5 * 2 = 1     … 1
2 / 2 = 1 … 0
1 / 2 = 0 … 1

所以整数部分转为 10011,小数部分转为0.001,合起来为10011.001

提示整数部分可用堆栈,小数部分可用队列实现

注意:必须按照上述方法来实现数制转换,其他方法0分

输入

第一行输入一个t,表示下面将有t组测试数据。

接下来每行包含两个参数n和k,n表示要转换的数值,可能是非整数;k表示要转换的数制,1<k<=16

输出

对于每一组测试数据,每行输出转换后的结果,结果精度到小数点后3位

输出小数点后几位的代码如下:

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

int main()
{
double r = 123.56789;
cout<<fixed<<setprecision(4)<<r<<endl;   //输出小数点后4

return 0;
}

输入样例1

2
19.125 2
15.125 16

输出样例1

10011.001
F.200

思路分析

进制转换没我想象中那么复杂,特别是有了栈和队列的加持之后,这样就只分两部分:

一部分用栈去存储整数部分,一部分用队列去存储小数部分。

上来先处理一下,把实数拆成整数和小数,这里需要特批整数部分为0的情况,直接把字符‘0’压入栈。

整数部分循环跳出的条件设计成整数部分不为0,小数部分循环跳出的条件设计成小数部分不为1。

还需要注意的是小数部分只输出三位……

AC代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin>>t;
    while(t--){
        queue<char>decimals;
        stack<char>integers;
        double real;
        cin>>real;
        int integer=int(real);
        double decimal=real-integer;
        if(integer==0){
            integers.push('0');
            decimal=real;
        }
        int scale;
        cin>>scale;
        char one;
        while(integer){
            if(integer%scale>=10)one= 'A' + integer % scale - 10;
            else one= integer % scale + '0';
            integers.push(one);
            integer=integer/scale;
        }
        while(!integers.empty()){
            cout<<integers.top();
            integers.pop();
        }
        cout<<'.';
        int bits=1;
        while(decimal!=1&&bits<=3){
            int temp=int(decimal*scale);
            if(temp>=10)one='A'+temp-10;
            else one='0'+temp;
            decimals.push(one);
            decimal=decimal*scale-temp;
            bits++;
        }
        while(!decimals.empty()){
            cout<<decimals.front();
            decimals.pop();
        }
        cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_62264287/article/details/127269135