算法笔记问题 B: 数制转换
程序员文章站
2024-03-18 17:50:16
...
注意的点是输入的带字母的可能有大写也有小写。
题目描述:
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。
#include<cstdio>
#include<string.h>
using namespace std;
char shiliu[16]={'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
int main(){
int a,b;
char n[33],rr[33];
while(scanf("%d %s %d",&a,n,&b)!=EOF){
long long res=0,product=1;//先把该数的十进制表示出来
int t=strlen(n);
for(int i=t-1;i>=0;i--){
if(n[i]>57){
//是字母,有可能大写,也有可能小写
if(n[i]>96){
//输入是小写,相减的目的是确保a对应10
res+=product*(n[i]-'W');
}
else{
//此时输入有大写
res+=product*(n[i]-'7');
}
}
else
res+=product*(n[i]-'0');
product*=a;
}
if(b==10) printf("%lld\n",res);
else{
int index=0;
do{
int k=res%b;
rr[index]=shiliu[k];
res/=b;
index++;
}while(res!=0);
//输出
for(int i=index-1;i>=0;i--){
printf("%c",rr[i]);
}
printf("\n");
}
}
return 0;
}