题目描述
请计算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之间。 输出 每行输出一个样例的结果。
样例输入
2
1000 2 1F 16
-1 10 20 3
样例输出
39
5
AC代码
#include<stdio.h>
#include<string.h>
int Ten(char s[],int b){
int len=strlen(s);
int i;
int sum=0;//s对应10进制的值
int a[105]={};//数组a用来存放字符串s1对应的数字
//正数的情况
if(s[0]!='-'){
for(i=0;i<len;i++){
if(s[i]>='A'&&s[i]<='Z'){
a[i]=s[i]-'A'+10;
}
else if(s[i]>='a'&&s[i]<='z'){
a[i]=s[i]-'a'+36;
}
else{
a[i]=s[i]-'0';//此次需要减'0',否则得到的将是ASCII码值
}
}
//b进制转10进制
for(i=0;i<len;i++){
sum*=b;
sum+=a[i];
}
}
//考虑负数的情况
else{
for(i=1;i<len;i++){//从第二个字符开始
if(s[i]>='A'&&s[i]<='Z'){
a[i]=s[i]-'A'+10;
}
else if(s[i]>='a'&&s[i]<='z'){
a[i]=s[i]-'a'+36;
}
else{
a[i]=s[i]-'0';
}
}
for(i=0;i<len;i++){//b进制转10进制
sum*=b;
sum+=a[i];
}
sum=-sum;
}
return sum;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
char s1[1005],s2[1005];
int b1,b2;
scanf("%s%d%s%d",s1,&b1,s2,&b2);
int sum1=Ten(s1,b1);
int sum2=Ten(s2,b2);
printf("%d\n",sum1+sum2);
}
}
因为要考虑负数的情况,所以先判断数组第一个字符是否为'-',若是,则从下一个字符开始读,当成正数计算,最后结果加个负号即可。注意,字符1存入int数组是1对应的ASCII码值,所以要减去'0'。有时候输入两个字符串要注意空格的吸收。
b进制转10进制
这里没有考虑16进制等情况,要求输入为数字。16进制情况可参考上面AC的代码。
核心思路
int sum=0;
for(i=0;i<cnt;i++){
sum*=b;
sum+=a[i];
}
输入:1101 2
输出:13
#include<stdio.h>
int main()
{
int n,b;
scanf("%d%d",&n,&b);
int a[10]={};
int i,j,cnt=0;
while(n!=0){//分离整数各项
a[cnt]=n%10;
n/=10;
cnt++;
}
int sum=0;
for(i=cnt-1;i>=0;i--){
sum*=b;
sum+=a[i];
}
printf("%d\n",sum);
}
10进制转b进制
这里也没有考虑16进制等情况,只是作为一个参考。
核心思路
n模b的数存入数组中对应b进制每一位的数,在将数“拼接”起来。
拼接方法如下:
for(i=0;i<cnt;i++){
sum*=10;
sum+=a[i];
}
输入:12 2
输出:1100
#include<Stdio.h>
int main()
{
int n,b,i,j,cnt=0,sum=0;
scanf("%d%d",&n,&b);
int a[15]={};
while(n!=0){
a[cnt]=n%b;
n/=b;
cnt++;
}
for(i=cnt-1;i>=0;i--){
sum*=10;
sum+=a[i];
}
printf("%d\n",sum);
}
对进制转换类型的题目多练才能有手感!