问题 B: DS队列+堆栈--数制转换
题目描述
对于任意十进制数转换为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位.
样例输入
4
19.125 2
15.125 16
84.7866 3
325.9999 13
样例输出
10011.001
F.200
10010.210
1C0.CCC
tips:第三第四组样例输入就是告诉你小数部分可能无限乘法之后还是不能得到整数,所以循环个四五次得到要保留的小数位数就可以了
样例代码:
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include <iomanip>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)//储存所有的类型
{
double yuan;
int zh;
queue<char> que;
stack<char>st;//定义了4个整型元素的向量,且给出每个元素的初值为0
cin >> yuan >> zh;
int zhengshu = int(yuan);
double xiaoshu = yuan - zhengshu;
while (zhengshu)//处理整数部分
{
int k = zhengshu % zh;
zhengshu /= zh;
if (k > 9)//一个一个压栈,注意可能是用字母表示的情况
st.push('A' + k - 10);
else
st.push(k + '0');
}
int tt = 5;
while (xiaoshu)
{
tt--;
if (tt == 1)break;
xiaoshu = xiaoshu * zh;
int k = int(xiaoshu);
if (k > 9) {
que.push(k + 'A' - 10);//一个一个压到队列里
}
else
que.push(k + '0');
xiaoshu = xiaoshu - k;//再次获取小数部分
}
if (st.empty())//如果没有整数部分,用0.代替整数部分
cout << "0.";
else {
while (!st.empty()) //把整数部分一个一个倒着弹出,再加一个‘.'
{
cout << st.top();
st.pop();
}
cout << '.';
}
if (que.empty())
cout << "000";
else
{
int o = 3;//控制三位小数输出
while (o--)
{
if (que.empty())//空就补0
cout << "0";
else
{
cout << que.front();//把最先算得的输出
que.pop();
}
}
}
cout << endl;
}
return 0;
}