1942数制转换

Description

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。

Input

输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

Output

可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。

Sample Input Copy

4 123 10

Sample Output Copy

27

HINT

用字符串存储和表示不同进制的数。

idea

  • a,b在2 ~ 16进制间 → 11 ~ 16进制需要借助字母表示 → 输入的a进制整数n和输出的b进制数m需要用字符串表示

solution

#include <stdio.h>
#include <string.h>
int main(){
	int a, b;
	char n[40];
	while(scanf("%d %s %d", &a, n, &b) != EOF){
		int m1 = 0, n1 = 0, power = 1, num = 0, t;		
		char m[40];
		
		for(int i = strlen(n) - 1; i >= 0; i--){
			if(n[i] >= '0' && n[i] <= '9')
				n1 += (n[i] - '0') * power;
			else if(n[i] >= 'a' && n[i] <= 'f')
				n1 += (n[i] - 87) * power;
			else if(n[i] >= 'A' && n[i] <= 'F')
				n1 += (n[i] - 55) * power;
			power *= a;
		}
		
		do{
			t = n1 % b;
			if(t < 10)
				m[m1++] = t + '0';
			else{
				m[m1++] = t + 'A' - 10;
			}	
			n1 /= b;
		}while(n1 != 0);
		for(int i = m1 - 1; i >= 0; i--){
			printf("%c", m[i]);
		}
		printf("\n");
	}
	return 0;
}
posted @ 2022-01-15 22:55  Moliay  阅读(16)  评论(0)    收藏  举报