机试算法讲解: 第21题 再谈进制转换

/*
求任意两个不同进制非负整数的转换,所给整数在long范围。不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1...,9,A,B,...,F)
输入:
一行,3个整数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
提示:可以用字符串表示不同进制的整数

思路:
a->10->b
a进制先转换为10进制,利用各位依次乘以10的0次方,1次方,。。。.10进制转换为进制,利用除k取余法。
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char* argv[])
{
	long a,b;
	char n[20];
	while(EOF!=scanf("%d %s %d",&a,n,&b))
	{
		long lSum = 0;
		for(int i = 0 ; n[i]!='\0' ; i++ )
		{
			//关键还需要将a转换为10
			int x;
			if(n[i] <= 'z' && n[i] >= 'a')
			{
				x = n[i] - 'a' + 10;
			}
			else if(n[i] <= 'Z' && n[i] >= 'A')
			{
				x = n[i] - 'A' + 10;
			}
			else if(n[i] <= '9' && n[i] >= '0')
			{
				x= n[i] - '0';
			}
			//lSum += lSum*a + x;//易错,这里不是lSum +=,而是lSum = 
			lSum = lSum*a + x;
			//printf("%ld",lSum);
		}
		printf("%ld\n",lSum);
		//接下来将10进制数转换为b进制数,采用除b取余的方法
		int iBit[20],j = 0;
		char sBit[20];
		do{
			//iBit[j++] = lSum % b;//易错,这边还需要将超过10的数字转换为字符,所以不管数字和字符统一用字符表示
			iBit[j] = lSum % b;
			sBit[j] = iBit[j] < 10 ? (iBit[j] + '0') : (iBit[j] - 10 + 'A');
			lSum /= b;
			j++;
		}while(lSum);
		sBit[j] = '\0';
		//逆序打印
		j--;
		for(; j >= 0 ; j--)
		{
			printf("%c",sBit[j]);
		}
	}
	system("pause");
	getchar();
	return 0;
}










你可能感兴趣的:(进制转换,机试算法)