a+b
1、题目内容
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的值都在-231到231-1之间。 输出 每行输出一个样例的结果。
Sample Input
2
1000 2 1F 16
-1 10 20 3
Sample Output
39
5
2、题目分析
这个题目中,主要就是需要考虑好如何将一个字符串根据它的进制转化为一个十进制数字,同时还需要考虑一波符号的问题,有些串带负号。在如何转化进制方面,给的建议是:以10进制为例去理解其它进制的转化。
3、参考代码
#include<stdio.h>
#include<string.h>
int change(char str[],int t) //传入字符串与该字符串对应的进制
{
int i=0;
int result=0;//存储结果
int flag=1;//用来做符号标记
int m=strlen(str); //数字串长度
if(str[0]=='-') //字符串首位为-,说明为负数
{
flag=-1;
i++;
}
for(;i<m;i++)
{
int j;
if(str[i]>='0'&&str[i]<='9') //数字字符转化为数字
{
j=str[i]-'0';
}
else if(str[i]>='A'&&str[i]<='Z') //题目说使用A-Z依次表示10到35
{
j=str[i]-'A'+10;
}
else if(str[i]>='a'&&str[i]<='z') //题目说a-z表示36-61
{
j=str[i]-'a'+36;
}
result=result*t+j; //进制公式
}
return flag*result;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int a,b,Ta,Tb;
char x[100],y[100];
scanf(" %s %d %s %d",x,&Ta,y,&Tb);
a=change(x,Ta); //调用函数
b=change(y,Tb); //调用函数
printf("%d\n",a+b);
}
return 0;
}