a進制轉換b進制


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

  1. a進制轉換爲10進制

1)若a=10
下一步
2)若a!=10
a進制轉換爲10進制

  1. 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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章