http://ac.jobdu.com/problem.php?cid=1040&pid=61
- 题目描述:
-
将M进制的数X转换为N进制的数输出。
- 输入:
-
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
- 输出:
-
输出X的N进制表示的数。
- 样例输入:
-
16 10 F
- 样例输出:
-
15
- 提示:
-
输入时字母部分为大写,输出时为小写,并且有大数据。
// 题目62:进制转换.cpp: 主项目文件。 #include "stdafx.h" #include <stdio.h> #include <string.h> const int N=4003; char str[N];//输入字符串 int start[N],ans[N],res[N]; //被除数,商,余数 //转换前后的进制 int oldBase; int newBase; void change() {//各个数位还原为数字形式 int i,len = strlen(str); start[0] = len; for(i=1;i<= len;i++) { if(str[i-1] >= '0' && str[i-1] <= '9') { start[i] = str[i-1] - '0'; } if(str[i-1] >= 'A' && str[i-1] <= 'Z') { start[i] = str[i-1] - 'A' + 10; } } } void solve() { memset(res,0,sizeof(res));//余数初始化为空 int y,i,j; //模n取余法,(总体规律是先余为低位,后余为高位) while(start[0] >= 1) {//只要被除数仍然大于等于1,那就继续“模2取余” y=0; i=1; ans[0]=start[0]; // while(i <= start[0]) { y = y * oldBase + start[i]; ans[i++] = y/newBase; y %= newBase; } res[++res[0]] = y;//这一轮运算得到的余数 i = 1; //找到下一轮商的起始处 while((i<=ans[0]) && (ans[i]==0)) i++; //清除这一轮使用的被除数 memset(start,0,sizeof(start)); //本轮得到的商变为下一轮的被除数 for(j = i;j <= ans[0];j++) start[++start[0]] = ans[j]; memset(ans,0,sizeof(ans)); //清除这一轮的商,为下一轮运算做准备 } } void output() {//从高位到低位逆序输出 int i; for(i = res[0];i >= 1;--i) { if(res[i]<10) printf("%d",res[i]); else printf("%c",res[i] - 10 + 'a'); } printf("\n"); } void reverse() { for(int i = 1,j = 0;i <= res[0];i++,j++) str[j] = res[i]+'0'; str[ res[0] ] = '\0'; } int main() { while(scanf("%s",str)!=EOF) { oldBase=10,newBase=2; change(); solve(); reverse(); oldBase=2,newBase=10; change(); solve(); output(); } return 0; }