http://codeup.cn/problem.php?cid=100000579&pid=1
题目
题目描述
求任意两个不同进制非负整数的转换(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)。
样例输入
4 123 10
样例输出
27
提示
用字符串存储和表示不同进制的数。
思路
若a=b
直接输出
若a!=b
- a进制转换为10进制
1)若a=10
下一步
2)若a!=10
a进制转换为10进制
- 10进制转换为b进制
1)若b=10
输出
2)若b!=10
10进制转换为b进制
输出
子函数
a进制转换为10进制
long long int N_ten(int a,char n[]){
int p=1,len=strlen(n);
long long int sum=0;
for(int i=len-1;i>=0;i--){
if(isdigit(n[i])){
sum=sum+(n[i]-'0')*p;
}
else{
switch(n[i]){
case 'a':sum=sum+10*p;break;
case 'A':sum=sum+10*p;break;
case 'b':sum=sum+11*p;break;
case 'B':sum=sum+11*p;break;
case 'c':sum=sum+12*p;break;
case 'C':sum=sum+12*p;break;
case 'd':sum=sum+13*p;break;
case 'D':sum=sum+13*p;break;
case 'e':sum=sum+14*p;break;
case 'E':sum=sum+14*p;break;
case 'f':sum=sum+15*p;break;
case 'F':sum=sum+15*p;break;
}
}
p*=a;
}
return sum;
}
10进制转换为b进制
if(b!=10){//如果不是10进制,那么10进制转b进制
char str[100];
int len=0;
while(tn){
if(tn%b<10){
str[len++]=tn%b+'0';
}
else{
switch(tn%b)
{
case 10: str[len++]='A';break;
case 11: str[len++]='B';break;
case 12: str[len++]='C';break;
case 13: str[len++]='D';break;
case 14: str[len++]='E';break;
case 15: str[len++]='F';break;
}
}
tn/=b;
}
for(int i=len-1;i>=0;i--)
printf("%c",str[i]);
printf("\n");
return;
}
AC代码
#include<bits/stdc++.h>
long long int N_ten(int a,char n[]){
int p=1,len=strlen(n);
long long int sum=0;
for(int i=len-1;i>=0;i--){
if(isdigit(n[i])){
sum=sum+(n[i]-'0')*p;
}
else{
switch(n[i]){
case 'a':sum=sum+10*p;break;
case 'A':sum=sum+10*p;break;
case 'b':sum=sum+11*p;break;
case 'B':sum=sum+11*p;break;
case 'c':sum=sum+12*p;break;
case 'C':sum=sum+12*p;break;
case 'd':sum=sum+13*p;break;
case 'D':sum=sum+13*p;break;
case 'e':sum=sum+14*p;break;
case 'E':sum=sum+14*p;break;
case 'f':sum=sum+15*p;break;
case 'F':sum=sum+15*p;break;
}
}
p*=a;
}
return sum;
}
void change(int a,char n[],int b){
int lenn=strlen(n);
if(n[0]=='0'&&lenn==1){//特判0
printf("0\n") ;
return;
}
long long int tn;
if(a!=10)//如果不是10进制,那么a进制转b进制
tn=N_ten(a,n);
else//如果就是10进制,那么直接赋给tn
sscanf(n,"%lld",&tn);
if(b!=10){//如果不是10进制,那么10进制转b进制
char str[100];
int len=0;
while(tn){
if(tn%b<10){
str[len++]=tn%b+'0';
}
else{
switch(tn%b)
{
case 10: str[len++]='A';break;
case 11: str[len++]='B';break;
case 12: str[len++]='C';break;
case 13: str[len++]='D';break;
case 14: str[len++]='E';break;
case 15: str[len++]='F';break;
}
}
tn/=b;
}
for(int i=len-1;i>=0;i--)
printf("%c",str[i]);
printf("\n");
return;
}
else{//如果就是10进制,那么直接输出
printf("%lld\n",tn);
return;
}
}
int main(){
char str[100];
int a,b;
while(scanf("%d %s %d",&a,str,&b)!=EOF){
if(a!=b)
change(a,str,b);
else{
for(int i=0;i<strlen(str);i++)
printf("%c",str[i]);
printf("\n");
}
}
return 0;
}