1942 Problem B:数制转换

题目描述

求任意两个不同进制非负整数的转换(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进制,要将具体数字转化为字符型;最终从高位输出;

代码如下:

#include <cstdio>
#include <cstring>

char ans[40], n[40];

int main()
{
	long long a, b;
	int temp, len;
	while (scanf ("%lld %s %lld", &a, n, &b) != EOF) {
		int sum = 0;
		int len = strlen (n);								    //确定字符个数; 
		for (int i = 0; i < len; i++) {						
			if (n[i] >= 'a')		n[i] = n[i] - 32;				//小写字母转化为大写; 
		  	temp = (n[i] >= 'A' ? n[i] - 'A' + 10 : n[i] - '0'); 	//转化为对应数字;		
			sum = sum * a + temp;		
		}
		
		int count = 0;
		do {
			if (sum % b <= 9)		ans[count++] = sum % b + '0';			//对结果进行修正; 
			else					ans[count++] = sum % b + 'A' - 10;
			sum = sum / b;
		}	while (sum != 0);
		
		for (int i = count - 1; i >= 0; i--) {					        	//高位输出; 
			printf ("%c", ans[i]);    
			if (i == 0) 	printf ("\n");
		}
	}
	
 	return 0;
}

猜你喜欢

转载自blog.csdn.net/privilage/article/details/79959279
今日推荐