题目描述
对于任意十进制数转换为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\n
F.200\n
#include<iostream>
#include<stack>
#include<queue>
#include<iomanip>
using namespace std;
int main() {
int t;
double n;//转换数字
int k;//进制
stack<int>s;
queue<int>q;
cin >> t;
for (int i = 0; i < t; i++) {
cin >> n >> k;
int zhengshu = int(n);//取整数部分
double xiaoshu = n - zhengshu;//小数部分
while (zhengshu / k != 0) {//只要商不等于0
s.push(zhengshu % k);
zhengshu = zhengshu / k;
}
s.push(zhengshu % k);//最后一位1
/*while (xiaoshu * k != 1) {
q.push(int(xiaoshu * k));
xiaoshu = xiaoshu * k;
}*/
int j = 0;
while (j < 3) {//保证只算三位,输出三位
xiaoshu = xiaoshu * k;//先算出相乘的double结果
q.push(int(xiaoshu));//再把整数部分存进队列
xiaoshu -= int(xiaoshu);//得到剩余的小数部分继续相乘
j++;
}
char kk[6] = { 'A','B','C','D','E','F'};
while (!s.empty()) {
if (s.top() < 10) {//数字表示
cout << s.top();
}
else {
cout << kk[s.top() - 10];
}
s.pop();
}
cout << ".";
while (!q.empty()) {
if (q.front() < 10) {//小于10,可以用数字表示
cout << q.front();
}
else {
cout << kk[q.front() - 10];
}
q.pop();
}
cout << endl;
}
return 0;
}