题目描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
输入
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
样例输入
4 123 10
样例输出
27
提示
用字符串存储和表示不同进制的数。
思路:
通过字符串读取a进制数,将其中的小写字母先转换为大写字母,再将其转换为相应的数字,计算出十进制下的结果;
通过除基取余转化为b进制,要将具体数字转化为字符型;最终从高位输出;
代码如下:
#include <cstdio>
#include <cstring>
char ans[40], n[40];
int main()
{
long long a, b;
int temp, len;
while (scanf ("%lld %s %lld", &a, n, &b) != EOF) {
int sum = 0;
int len = strlen (n); //确定字符个数;
for (int i = 0; i < len; i++) {
if (n[i] >= 'a') n[i] = n[i] - 32; //小写字母转化为大写;
temp = (n[i] >= 'A' ? n[i] - 'A' + 10 : n[i] - '0'); //转化为对应数字;
sum = sum * a + temp;
}
int count = 0;
do {
if (sum % b <= 9) ans[count++] = sum % b + '0'; //对结果进行修正;
else ans[count++] = sum % b + 'A' - 10;
sum = sum / b;
} while (sum != 0);
for (int i = count - 1; i >= 0; i--) { //高位输出;
printf ("%c", ans[i]);
if (i == 0) printf ("\n");
}
}
return 0;
}