Description | ||
请计算a+b,但a和b是按不同的进制给出的。进制最小为2进制,最大为62进制,其中使用A-Z依次表示10到35,a-z表示36-61。请写出a+b的结果,结果按十进制输出。 输入 第一行是一个整数N,表示有多少个测试样例,以后每行是一个样例,每行是4个部分,分别为a的值,a的进制,b的值,b的进制。其中值都是用一个字符串表示,进制都是一个整数。4个部分之间用一个空格隔开,保证输入的合法,a、b和a+b的值都在-2^31到2^31-1之间。 输出 每行输出一个样例的结果。 | ||
Sample Input | ||
2 1000 2 1F 16 -1 10 20 3 | ||
Sample Output | ||
39 5 | ||
首先定义一个函数用来将各种进制转换为十进制,方法:其他进制转十进制
然后就不难了
#include <stdio.h>
#include <math.h>
#include <string.h>
int turn(char str[32],int jinzhi)
{
int sum,i,temp,len;
sum = 0,len = strlen(str);
for(i = 0;i < len;i++)
{
if(str[i] == '-')
continue;
if(str[i] >= '0'&&str[i] <= '9')
str[i] -= 48;
else if(str[i] >= 'A'&&str[i] <= 'Z')
str[i] -= 55;
else if(str[i] >= 'a'&&str[i] <= 'z')
str[i] -= 61;
if(str[i]==0)
temp = 0;
else
temp = str[i]*pow(jinzhi,len-1-i);
sum += temp;
}
return sum;
}
int main()
{
int n,x,y,a,b;
char str1[32],str2[32];
scanf("%d",&n);
while(n--)
{
scanf("%s%d%s%d",str1,&x,str2,&y);
a = turn(str1,x);
b = turn(str2,y);
if(str1[0]=='-')
a *=(-1);
if(str2[0]=='-')
b *=(-1);
printf("%d\n",a+b);
}
return 0;
}