题目描述
将M进制的数X转换为N进制的数输出。
输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出
输出X的N进制表示的数。
样例输入
10 2
11
样例输出
1011
提示 [+]
*** 提示已隐藏,点击上方 [+] 可显示 ***
来源
注意:
(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;
}
可以用栈存储,参考:点击打开链接