1047: 小A的计算器

    xiaoxiao2024-04-19  2

    1047: 小A的计算器

    时间限制: 1 Sec   内存限制: 128 MB 提交: 101   解决: 86 [ 提交][ 状态][ 讨论版]

    题目描述

    以往的操作系统内部的数据表示都是二进制方式,小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

    我是先把26进制转化为10进制,相加以后再转化为26进制输出

    #include<iostream> #include<cmath> using namespace std; int changezm(string a) { int len=(a).size(); int k=1; int c(0); for(int i=0;i<len;i++) { int b=a[i]-97; c+=pow(26,len-k)*b; k++; } return c; } void changesz(int a) { int b[10],j(a); int i=0; while(j!=0) { b[i]=j%26; j=j/26; i++; } for(int k=i-1;k>=0;k--) { switch(b[k]) { case 0:cout<<'a';break;case 1:cout<<'b';break; case 2:cout<<'c';break;case 3:cout<<'d';break; case 4:cout<<'e';break;case 5:cout<<'f';break; case 6:cout<<'g';break;case 7:cout<<'h';break; case 8:cout<<'i';break;case 9:cout<<'j';break; case 10:cout<<'k';break;case 11:cout<<'l';break; case 12:cout<<'m';break;case 13:cout<<'n';break; case 14:cout<<'o';break;case 15:cout<<'p';break; case 16:cout<<'q';break;case 17:cout<<'r';break; case 18:cout<<'s';break;case 19:cout<<'t';break; case 20:cout<<'u';break;case 21:cout<<'v';break; case 22:cout<<'w';break;case 23:cout<<'x';break; case 24:cout<<'y';break;case 25:cout<<'z';break; } } } int main() { int n; cin>>n; while(n>0) { string a,b; cin>>a>>b; int x=changezm(a); int y=changezm(b); changesz(x+y); n--; cout<<endl; } return 0; }肯定有不好的地方,我会回来优化的

    下面是我师父的:先一位一位转换再相加

    #include<iostream> using namespace std; void MoveRight(char x[],int sz) { int i=0; while(x[i]!='\0') i++; int j=sz-1; for(int k=i;k>=0;k--) x[j--]=x[k]; for(int p=0;p<=j;p++) x[p]='a'; } int main() { int N; char x[11]; char y[11]; char sum[11]; cin>>N; while(N--){ cin>>x>>y; MoveRight(x,11); MoveRight(y,11); char jinwei='a'; for(int i=9;i>=0;i--) { char sub=x[i]-'a'+y[i]-'a'+jinwei-'a'+'a'; if(sub>'z'){ sub-=26; jinwei='b'; } sum[i]=sub; } sum[10]='\0'; int i=0; while(sum[i]=='a') i++; while(sum[i]!='\0') cout<<sum[i++]; cout<<endl; } return 0; } <span style="color:#ff0000;">我后来又写了一个:</span>#include<iostream> #include<cstring> using namespace std; int main() { int n; cin>>n; while(n>0) { char a[100]; char b[100]; cin>>a>>b; int l1=strlen(a); int l2=strlen(b); int i=l1-1,j=l2-1; int x(0); while(j>=0&&i>=0) { if(i>j) { a[i]=char(a[i]+b[j]-97-26*x); x=(a[i]-97)/25; } else { b[j]=char(a[i]+b[j]-97-x*26); x=(b[j]-97)/25; } i--; j--; } if(i>j) cout<<a<<endl; else cout<<b<<endl; n--; } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1288157.html
    最新回复(0)