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;
}