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;
}