codeup27981 进制转换
时空限制 1000ms/128MB
题目描述
大家都知道,计算机中是以二进制存储的!但是在现实生活中,我们遇到过各种各样的进制情况,
我们接触得最多的就是十进制,不过,生活中还存在各种进制计数的情况。例如:一个星期七天,是7进制。一年十二个月,是12进制等等。小明最近在学c语言,熟悉了c语言中的各种进制转换问题,所以就尝试着各种进制转换的程序。
现在他想写一个程序,就是把一个无符号数n,转化成在b进制下的表示。例如: n为10,b为2,则转化后为1010。又如:n为10,b为16,则转化后为0xA。
输入
文件包含T组测试样例,第一行为数字T,第二行开始,输入两个数,分别为n,b。n表示要转化的数,b表示b进制。运行到文件结尾(0 <= n <= 1000000000,2<=b<=16)。
输出
输出n在b进制下的表示。注意:如b为16输入时记得加上0X,字母都是以大写的形式)
样例输入
4
10 2
10 16
100 7
1000000000 16
样例输出
1010
0XA
202
0X3B9ACA00
代码
法一:递归
#include<iostream>
using namespace std;
void zhuan(int n,int b){
if (n>0){
zhuan(n/b,b);
if (n%b<10) cout<<n%b;
else cout<<char(n%b+'A'-10);
}
}
int main(){
int T,n,b;
cin>>T;
while (T--){
cin>>n>>b;
if (b==16) cout<<"0X";
if (n==0) { cout<<0<<endl; continue; }
zhuan(n,b);
cout<<endl;
}
return 0;
}
法二:STL栈
#include<iostream>
#include<stack>
using namespace std;
stack<char> s;
int main(){
int T,n,b;
cin>>T;
while (T--){
cin>>n>>b;
if (b==16) cout<<"0X";
if (n==0) { cout<<0<<endl; continue; }
while (n){
if (n%b<10) s.push(char(n%b+'0'));
else s.push(char(n%b+'A'-10));
n /= b;
}
while (!s.empty()){
cout<<s.top();
s.pop();
}
cout<<endl;
}
return 0;
}
法三:手动栈
#include<iostream>
using namespace std;
char stack[50];
int main(){
int T,n,b,top;
cin>>T;
while (T--){
cin>>n>>b;
if (b==16) cout<<"0X";
if (n==0) { cout<<0<<endl; continue; }
top = 0;
while (n){
if (n%b<10) stack[++top]=n%b+'0';
else stack[++top]=n%b+'A'-10;
n /= b;
}
while (top)
cout<<stack[top--];
cout<<endl;
}
return 0;
}