-
题目描述:
-
以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-25分别由a-z表示。
现在小A要在这个操作系统上实现一个计算器,这个计算器要能实现26进制数的加法运算。你能帮小A实现这个计算器吗?
-
输入:
-
输入的第一行包括一个整数N(1<=N<=100)。
接下来的N行每行包括两个26进制数x和y,它们之间用空格隔开,每个数的位数最多为10位,我们可以保证相加的结果的位数最多也是10位。每个数会用小A所设计的操作系统中的表示方法来表示,如:bsadfasdf。即每个数的各个位均由26个小写字母a-z中的一个来表示。
-
输出:
-
输出x和y相加后的结果,结果也要用题目中描述的26进制数来表示。
-
样例输入:
-
4 ba cd c b b c ba c
-
样例输出:
-
dd d d bc
-
提示:
-
1.注意,26进制数的表示方式和10进制数一样,最右边是最低位。
2.输入的两个数有可能有前缀0,即a,请在程序中进行处理。
3.结果中如果出现前缀0,请自动滤除,除非结果就是0。如:结果为ab时,要输出b,因为a表示0。
-
-
-
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
按照正常的加法来做,注意要将两个字符串的顺序搞反,再从第一位开始累加,进位不要忘记:
-
-
-
#include<iostream> #include<string.h> using namespace std; char x[11],y[11]; int xlen,ylen; bool rev( ) { int j; char temp; for(j=xlen/2-1;j>=0;j--) { temp=x[j]; x[j]=x[xlen-1-j]; x[xlen-1-j]=temp; } for(j=ylen/2-1;j>=0;j--) { temp=y[j]; y[j]=y[ylen-1-j]; y[ylen-1-j]=temp; } return true; } int main() { int n; int j,k,mi,jw; while(cin>>n&&n!=0) { for(k=0;k<n;k++) { cin>>x>>y; xlen=strlen(x); ylen=strlen(y); rev(); mi=xlen>ylen?ylen:xlen; char temp[11]={NULL}; if(xlen<ylen) strcpy(temp,y); else strcpy(temp,x); j=0; jw=0; while(j<mi) { temp[j]=x[j]+y[j]-'a'-'a'+jw; jw=temp[j]/26; temp[j]=temp[j]%26+'a'; j++; } while(jw>0) { if(j<xlen||j<ylen) { temp[j]=temp[j]-'a'+jw; jw=temp[j]/26; temp[j]=temp[j]%26+'a'; j++; } else { temp[j]=jw+'a'; jw=0; } } int len=strlen(temp); for(j=len-1;j>0;j--) if(temp[j]!='a') break; for(;j>=0;j--) cout<<char(temp[j]); cout<<endl; } } return 0; } /************************************************************** Problem: 1340 User: 午夜小白龙 Language: C++ Result: Accepted Time:60 ms Memory:1520 kb ****************************************************************/