小Z学了进制表示法,他可以把一个十进制数 4 转化成二进制 0b100 或者 100B
其中 0b 和 B 都是二进制的标识
已知:
进制 | 标识 |
---|---|
二进制 | 前加 0b 或者后加 B |
八进制 | 前加 0o 或者后加 O |
十六进制 | 前加 0x 或者后加 H |
请你把一些数根据对应的标识化成十进制数
输入格式:
一个整数 T(1≤T≤10000) 表示有多少个进制数需要转化成十进制,
下面 T 行每行一个或二或八或十六进制的数。
保证转化后的十进制下的数小于 231
输出格式:
T 行分别是对应输入的十进制数。
输入样例:
3
100B
0o100
100H
输出样例:
4
64
256
提示:
十六进制下 10 用字母 a 表示, 11 用字母 b 表示,以此类推..
十六进制中字母可用大写或小写字母表示
# include <stdio.h>
# include <string.h>
# define ll long long
ll change28 ( ll base, char *s ) // base进制转化为10进制
{
int i;
ll res = 0, len = strlen(s);
for (i = 0; i < len; i ++ ) res = res *base + (s[i] - '0');
return res;
}
ll change16 ( char *s ) // 16进制转化为10进制
{
int i;
ll res = 0, len = strlen(s);
for (i = 0; i < len; i ++ )
{
switch ( s[i] )
{
case 'A': res = res * 16 +10; break;
case 'B': res = res * 16 +11; break;
case 'C': res = res * 16 +12; break;
case 'D': res = res * 16 +13; break;
case 'E': res = res * 16 +14; break;
case 'F': res = res * 16 +15; break;
case 'a': res = res * 16 +10; break;
case 'b': res = res * 16 +11; break;
case 'c': res = res * 16 +12; break;
case 'd': res = res * 16 +13; break;
case 'e': res = res * 16 +14; break;
case 'f': res = res * 16 +15; break;
default : res = res * 16 +(s[i] - '0'); break;
}
}
return res;
}
void Solve()
{
int i;
char s[100]; getchar();
scanf("%s", s);
if ( s[0] == '0' )
{
char ss[100];
for (i = 2; i < strlen(s); i ++)
ss[i - 2] = s[i]; // 从第三个字符开始截取
ss[strlen(s) - 2] = '\0';// 设置结束符
switch ( s[1] ) // 第二个字符
{
case 'b': printf("%lld\n",change28(2, ss)); break;
case 'o': printf("%lld\n",change28(8, ss)); break;
case 'x':printf("%lld\n",change16(ss)); break;
default: puts("0");
}
}
else
{
int i;
char ss[100];
for (i = 0; i < strlen(s) - 1;i ++ ) // 不截取最后一个
ss[i] = s[i];
ss[strlen(s) - 1] = '\0';// 设置结束符
switch ( s[strlen(s) - 1] )// 最后一个字符
{
case 'B': printf("%lld\n",change28(2, ss)); break;
case 'O': printf("%lld\n",change28(8, ss)); break;
case 'H': printf("%lld\n",change16(ss)); break;
}
}
}
int main ()
{
int cass;
scanf("%d", &cass);
while (cass--)
{
Solve();
}
return 0;
}