在一次NOIP初赛模拟考试中,小明碰到了一道进制转换的题,由于没有学过进制转换,导致成绩不太理想,于是他下决心搞明白进制转换是怎么回事。
通过查阅资料他发现,进制有很多种,常用的有二进制、八进制、十进制和十六进制等,如果不超过十进制,0到9的十个数字就够用了,但超过十进制时,两位数字需要用一个字符去表示,通常用大写字母A表示十进制中的10,用大写字母B表示十进制中的11,用大写字母C表示十进制中的12,以此类推,用大写字母F表示十进制中的15,用大写字母G表示十进制中的16等等。
现在他想编写一个程序,将一个任意的n进制数转换成m进制的数。
输入格式
第一行仅有一个正整数n(1≤n≤16),表示给定数是一个n进制数。
第二行是一个字符串,描述了一个合法的n进制数。
第三行仅有一个正整数m(1≤m≤16),表示要将给定的n进制数转换成m进制数。
注意:所给的n进制数在其对应的10进制数中大小不会超过10^9。
输出格式
输出文件仅有一行,输出转换成m进制的数。
样例输入
2
101101
10
样例输出
45
样例输入
7
654321
8
样例输出
337315
#include<iostream>
#include<cstring>
using namespace std;
void decToOther(int tmp, int b);
void otherToDec(int a, char str[], int b);
const int MAXSIZE = 10000;
int a, b;
char str[MAXSIZE];
int main()
{
cin >> a >> str >> b //a、s、b分别为目前的进制、待转换的内容、目标进制
otherToDec(a, str, b); //统一先转换为10进制
return 0;
}
void otherToDec(int a, char str[], int b)
{//任意进制转换为十进制
int tmp = 0; //tmp保存十进制的值
int c = 1; //初始化权值为1
for (int i = strlen(str) - 1; i >= 0; i--)
{
int x; //存放当前位的数字
if (str[i] >= 'A' && str[i] <= 'Z') //字母A~Z表示整数10~35
x = str[i] - 'A' + 10;
else if (str[i] >= 'a' && str[i] <= 'z') //字母a~z表示整数36~61
x = str[i] - 'a' + 36;
else
x = str[i] - '0';
tmp = tmp + x * c; //累加将各个位上的值
c = c * a; //更新权值
}
decToOther(tmp, b); //由十进制转换为目标进制
}
void decToOther(int tmp, int b)
{//十进制转换为任意进制
int i = 0;
int s[MAXSIZE] = { 0 };
while (tmp != 0) //十进制转换为目标进制算法,结果放到数组s中
{
s[i] = tmp % b;
tmp= tmp / b;
i++;
}
for (; i > 0; i--) //利用ascll编码实现字母表示两位整数,并倒序输出转换结果
{
if (s[i - 1] > 9 && s[i - 1] <= 35)
cout << (char)(s[i - 1] + 55); //当s[i-1]为整数10时(char)(10+55)='A',输出'A'
else if (s[i - 1] > 35 && s[i - 1] <= 61)
cout << (char)(s[i - 1] + 61); //当s[i-1]为整数36时(char)(36+61)='a',输出'a'
else
cout << s[i - 1]; //个位数输出本身
}
cout << '\n';
}