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

 

 

 

 

 

posted @ 2018-04-05 11:09  xzhws  阅读(76)  评论(0编辑  收藏  举报