您的位置:首页 > 其它

作业比赛编号 : 100000579 - 《算法笔记》3.5小节——入门模拟->进制转换 问题 B: 数制转换

2020-06-04 05:40 295 查看

问题 B: 数制转换

[命题人 : 外部导入] 时间限制 : 1.000 sec  内存限制 : 32 MB
  解决: 952提交: 3701统计

题目描述

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

输入

输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

输出

可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

样例输入 Copy

[code]<span style="color:#333333"><span style="color:#333333">4 123 10</span></span>

样例输出 Copy

[code]<span style="color:#333333"><span style="color:#333333">27</span></span>

提示

用字符串存储和表示不同进制的数。

注意:当转换的数中有AB等时,通过ASCII码来转换进制。

 

[code]#include<cstdio>
#include<cstring>
int main(){
int a,b;
char n[40];
char zimu[16]={'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F'
};//2进制~16进制
while(~scanf("%d%s%d",&a,n,&b)){
long long y=0,product=1;
int len=strlen(n);
for(int i=len-1;i>=0;i--)//从个位开始;将a进制数n转换为十进制数y
{                    //要判断字母大小写,以及对应数字代换计算,如使a=10
if(n[i]>57){     //输入是字母
if(n[i]>96) {//输入是小写字母
y=y+product*(n[i]-'W'); //相减使a值对应10;参考ASCII码表,a与W码值相差10
}else {      //输入是大写字母   a码值97,W码值87
y=y+product*(n[i]-'7'); //相减使A值对应10,A 码值65,7码值55
}
}else
y=y+(n[i]-'0')*product;        //输入是数字 0-9的ASCII码值为48-57
product*=a;

}
if(b==10) printf("%lld\n",y);//如果是转换10进制直接输出
else{
int z[40],num=0;            //将十进制数y转换为b进制数,注意输出也含字母 全用大写字母
do{
int k=y%b;
z[num]=zimu[k];
y=y/b;
num++;
}while(y!=0);
for(int i=num-1;i>=0;i--){
printf("%c",z[i]);
}
printf("\n");
}

}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐