清华大学考研复试机试:进制转换2

版权声明:本文为博主原创,未经博主允许不得转载。转载请附上原文链接。 https://blog.csdn.net/qq_38341682/article/details/88726812

题目描述

将M进制的数X转换为N进制的数输出。

输入描述

输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。

输出描述

输出X的N进制表示的数。

示例:

输入

10 2
11

输出

1011

注意

输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。

分析

这道题其实和10进制与2进制的转换是一样的,算法是相同的,只不过是换成了M和N而已,具体算法可以参考博主之前的博客进制转换。不过这道题需要注意输入和输出的大小写字母,所以需要单独写两个转化函数,这里使用了c库的判断类型的函数。另外这道题使用数组来存储输入和中间结果,并在计算过程中判断输入是否变为0,输入变为0就表示已经计算出结果,不再像之前一样单独写一个判断函数,这样提高了效率。还要注意结果的存储,如果将每一步的结果直接插入字符串的结尾,则在输出时需要逆序输出;如果插入到字符串的最前端,那么最后可以直接输出。

AC代码如下:

#include<iostream>
#include<string>
#include<cctype>//c库类型函数

using namespace std;

int m, n;//输入

int ctoi(char c)//char to int
{
	if(isalpha(c))//是否为字母
	{
		return c - 'A' + 10;
	}
	else
	{
		return c - '0';
	}
}

string itoc(int i)//int to char
{
	char temp;
	if(i > 9)
	{
		temp = i + 'a' - 10;
	}
	else
	{
		temp =  i + '0';
	}
	string str(1, temp);//string构造函数,将temp重复1次
	return str;
}

bool func(int* data, string& ret, int length)//转化函数
{
	bool flag = false;//结束标志
	int num = 0;
	for(int i = 0; i < length; ++i)
	{
		num = num*m + data[i];
		data[i] = num / n;//商
		if(data[i] != 0)//判断输入是否为0
		{
			flag = true;//输入不为0,需要继续计算
		}
		num %= n;//余数
	}
	ret.insert(0, itoc(num));//将结果插入最前端,最后就可以直接输出
	return flag;
}

int main(void)
{
	while(cin >> m >> n)
	{
		string str, result = "";
		cin >> str;
		bool flag = true;//结束标志
		int length = str.length();
		int* data = new int[length];//存储输入和中间结果
		for(int i = 0; i < length; ++i)
		{
			data[i] = ctoi(str[i]);//输入转换
		}
		while(flag)//主循环
		{
			flag = func(data, result, length);
		}
		cout << result;
		delete [] data;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38341682/article/details/88726812