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

2023-07-30 11:31:33 浏览数 (1)

题目描述

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

代码语言:javascript复制
整数部分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代码

代码语言:javascript复制
#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;
    }
}

0 人点赞