1. 程式人生 > >(數論)進位制轉換二(將a進位制換成b進位制)

(數論)進位制轉換二(將a進位制換成b進位制)

  數制轉換這類題解法很固定,常見的就兩種,昨天是第一種,今天是第二種。 題目:進位制轉換 時間限制:1 秒 記憶體限制:32 兆 題目描述:     求任意兩個不同進位制非負整數的轉換(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)。 樣例輸入:
15 Aab3 7 樣例輸出: 210306 提示: 可以用字串表示不同進位制的整數。 來源: 2008年北京大學圖形實驗室計算機研究生機試真題 思路:將 a 進位制轉換成十進位制數時,第K位的數值就是用該位的數字乘以進位制的a^(k-1)
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
	int a,b;
	char str[40];
	while(scanf("%d%s%d",&a,str,&b)!=EOF){
		int tmp = 0,c=1;
		int len=strlen(str);
		for(int i=len-1;i>=0;i--){
			//從低位到高位遍歷每個數位上的數
			int x;//計算該位上數字
			if(str[i]>='0' && str[i]<='9'){
				x = str[i]-'0';
			}
			else if(str[i]>='a' && str[i]<='z'){
				x = str[i]-'a'+10; 
			} 
			else
			{
				x = str[i]-'A'+10;
			}
			tmp+=x*c;
			c*=a; //求出這個十進位制數 
		}
		char ans[50];
		int cnt= 0;
		do{
			int x = tmp % b; //計算該位數字
			ans[cnt++]=(x<10)? x : x-10+'A';
			tmp/=b; 
		}while(tmp); 
		for(int i= cnt-1;i>=0;i--)
		  printf("%c",ans[i]);
		printf("\n");
	  }
	
	return 0;
}