题目1140: 进制转换
将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 - 9if(str[i] >= '0' && str[i] <= '9'){num[i] = str[i] - '0';}//a - Zelse if(str[i] >= 'a' && str[i] <= 'z'){num[i] = (str[i] - 'a' + 10);}//A - Zelse{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;//去掉商前缀0i = 0;while(i < L && ans[i] == 0){i++;}//商复制到numk = 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;}可以用栈存储,参考:点击打开链接