题目描述
对于任意十进制数转换为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;
}
}