版权声明:本文为博主原创,未经博主允许不得转载。转载请附上原文链接。 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;
}