时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:3873
解决:1494
- 题目描述:
-
求任意两个不同进制非负整数的转换(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)。
- 样例输入:
-
15 Aab3 7
- 样例输出:
-
210306
- 提示:
-
可以用字符串表示不同进制的整数。
代码:
#include <stdio.h>
#include <string.h>
#define N 12
int char2int(char c)
{
if (c >= '0' && c <= '9')
return (c - 48);
else
{
switch (c)
{
case 'a':
case 'A':
return 10;
break;
case 'b':
case 'B':
return 11;
break;
case 'c':
case 'C':
return 12;
break;
case 'd':
case 'D':
return 13;
break;
case 'e':
case 'E':
return 14;
break;
case 'f':
case 'F':
return 15;
break;
default:
return 0;
}
}
}
char int2char(int i)
{
if (i >= 0 && i <= 9)
return (i + 48);
else
{
switch (i)
{
case 10:
return 'A';
break;
case 11:
return 'B';
break;
case 12:
return 'C';
break;
case 13:
return 'D';
break;
case 14:
return 'E';
break;
case 15:
return 'F';
break;
default:
return '0';
}
}
}
int main(void)
{
int a, b, n;
char na[N], nb[N];
int i;
while (scanf("%d%s%d", &a, na, &b) != EOF)
{
n = 0;
for (i=0; i<strlen(na); ++i)
n = n*a + char2int(na[i]);
i = 0;
do {
nb[i] = int2char(n%b);
i++;
n = n/b;
}while (n>0);
nb[i] = '\0';
for (i=strlen(nb)-1; i>=0; --i)
printf("%c", nb[i]);
printf("\n");
}
return 0;
}
/**************************************************************
Problem: 1118
User: liangrx06
Language: C
Result: Accepted
Time:10 ms
Memory:912 kb
****************************************************************/