cjweffort

博客园 首页 联系 订阅 管理

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


posted on 2013-03-10 00:11  cjweffort  阅读(198)  评论(0编辑  收藏  举报