1. 程式人生 > >九度oj-進位制轉換

九度oj-進位制轉換

題目描述:

求任意兩個不同進位制非負整數的轉換(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

     解題思路:

    首先先把n進位制轉化為10進位制,然後再把10進位制轉化為m進位制。注意將10進位制轉成m進位制的時候,10進位制數本身為0的情況。

//完成二進位制到十六進位制之間的相互轉換
# include<stdio.h>
# include<string.h>
# include<math.h>
char symbol[]={'A','B','C','D','E','F'};

int main()
{
	int n,m,i;
	char str[50];
	while(scanf("%d",&n)!=EOF)
	{
		scanf("%s%d",str,&m);
		char ans[50];
		int sum=0,index=0;
		int len=strlen(str);
		//首先將m進位制轉換為10進位制
		for(i=0;i<len;i++)
		{
			if(str[i]>='a'&&str[i]<='z')
				str[i]=str[i]+'A'-'a';

			if(str[i]>='A'&&str[i]<='Z')//轉成十進位制
				sum+=(str[i]-'A'+10)*pow(n,len-i-1);//字元轉化為數字
			else
				sum+=(str[i]-'0'+0)*pow(n,len-i-1);//字元轉化為數字
		}
		

        //其次將10進位制轉換為n進位制
		do
		{
			if(sum%m>=10)
				ans[index++]=symbol[sum%m-10];
			else
				ans[index++]=sum%m+'0';//數字轉化為字元
			sum/=m;
		}while(sum!=0);//防止sum本身為0這種情況
		
		
		for(i=index-1;i>=0;i--)
			printf("%c",ans[i]);

		printf("\n");
		
	}
	return 0;
}