您的位置:首页 > 其它

题目1140: 进制转换

2013-03-19 10:48 295 查看
题目描述

将M进制的数X转换为N进制的数输出。



输入

输入的第一行包括两个整数:M和N(2<=M,N<=36)。

下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。



输出

输出X的N进制表示的数。



样例输入

10 2

11




样例输出

1011




提示 [+]

*** 提示已隐藏,点击上方 [+] 可显示 ***



来源

2008年清华大学计算机研究生机试真题



注意:

(1) 此题为高精度进制转换

(2)输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。

【思路】:

浅谈进制转换

/*********************************
*   日期:2013-2-19
*   作者:SJF0115
*   题号: 天勤OJ 题目1140: 进制转换
*   来源:http://acmclub.com/problem.php?id=1140
*   结果:AC
*   来源:2008年清华大学计算机研究生机试真题
*   总结:
**********************************/
#include <string.h>
#include <stdio.h>
#define MAXSIZE 1000
//输入的字符串
char str[MAXSIZE];
//被除数
int num[MAXSIZE];
//商
int ans[MAXSIZE];
//余数
int res[MAXSIZE];

//a进制转换为b进制
int Change(int a,int b){

	int L = strlen(str);
	int i,j,k,index,c;
	memset(num,0,sizeof(num));
	//字符转换为数字
	for(i = 0;i < L;i++){
		//0 - 9
		if(str[i] >= '0' && str[i] <= '9'){
			num[i] = str[i] - '0';
		}
		//a - Z
		else if(str[i] >= 'a' && str[i] <= 'z'){
			num[i] = (str[i] - 'a' + 10);
		}
		//A - Z
		else{
			num[i] = (str[i] - 'A' + 10);
		}
	}//for
	//转换
	index = 0;
	while(L){
		c = 0;
		for(i = 0;i < L;i++){
			//a进制
			c = c * a + num[i];
			//转换为b进制
			ans[i] = c / b;
			c = c % b; 
		}
		//这一轮除法得到的余数
		res[index++] = c;
		//去掉商前缀0
		i = 0;
		while(i < L && ans[i] == 0){
			i++;
		}
		//商复制到num
		k = 0;
		memset(num,0,sizeof(num));
		for(j = i;j < L;j++){
			num[k++] = ans[j];
		}
		L = k;
		memset(ans,0,sizeof(ans));
	}
	return index;
}

int main()
{
	int a,b,L;
	while(scanf("%d %d",&a,&b) != EOF){
		scanf("%s",str);
		//余数的个数
		L = Change(a,b);
		//输出(转换为字符 例如:余数为10 应该写成a)
		for(int i = L-1;i >= 0;i--){
			if(res[i] > 9){
				printf("%c",res[i] - 10 + 'a');
			}
			else{
				printf("%d",res[i]);
			}
		}
		printf("\n");
	}
    return 0;
}


可以用栈存储,参考:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: