欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法笔记问题 B: 数制转换

程序员文章站 2024-03-18 17:50:16
...

注意的点是输入的带字母的可能有大写也有小写。

题目描述:

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

#include<cstdio>
#include<string.h>
using namespace std;
char shiliu[16]={'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
int main(){
	int a,b;
	char n[33],rr[33];
	while(scanf("%d %s %d",&a,n,&b)!=EOF){
		long long res=0,product=1;//先把该数的十进制表示出来
		int t=strlen(n);
		for(int i=t-1;i>=0;i--){
			if(n[i]>57){
			//是字母,有可能大写,也有可能小写 
				if(n[i]>96){
					//输入是小写,相减的目的是确保a对应10
					res+=product*(n[i]-'W');
				}
				else{
					//此时输入有大写 
					res+=product*(n[i]-'7');
				}
			}
			else
				res+=product*(n[i]-'0');
			product*=a;
		}
		if(b==10) printf("%lld\n",res);
		else{
			int index=0;
			do{
				int k=res%b;
				rr[index]=shiliu[k];
				res/=b;
				index++;
			}while(res!=0);
			//输出
			for(int i=index-1;i>=0;i--){
				printf("%c",rr[i]);
			} 
			printf("\n");
		}
	}
	return 0;
}