看着挺麻烦的,写起来倒很顺手,把莫斯吗当做数字来存储就好,剩下的就是判断了。
今天刚搞定毕设,双爽爽的,写道题庆祝一下,就是代码太乱,懒得改。
#include <iostream>
#include <math.h>
using namespace std;
int po(int m){
int i,k=1;
for(i=0;i<m;i++)
k*=10;
return k;
}
int l[50],fn[3000],num[10000],xl[1000];
int main(){
int zn[100]={
12,
2111,
2121,
211,
1,
1121,
221,
1111,
11,
1222,
212,
1211,
22,
21,
222,
1221,
2212,
121,
111,
2,
112,
1112,
122,
2112,
2122,
2211,
1122,
1212,
2221,
2222
};
int i;
for(i=0;i<50;i++){
fn[zn[i]]=i;
if(zn[i]>1000)
l[i]=4;
else{
if(zn[i]>100)
l[i]=3;
else
{
if(zn[i]>10)
l[i]=2;
else
l[i]=1;
}
}
}
int z=0,kl=0,kn=0,m=0,ml=0,km=0,t=0,tn=1;
char s[1000],p;
cin>>t;
while(t>0){
cin>>s;
cout<<tn<<": ";
tn++;
z=0,kl=0,kn=0,m=0,ml=0,km=0;
for(i=0;i<strlen(s);i++){
z=s[i]-'A';
if(z<0 || z>25){
switch(s[i]){
case'_':z=26;break;
case'.':z=28;break;
case',':z=27;break;
case'?':z=29;break;
}
}
xl[kl]=l[z];
kl++;
ml=l[z];
m=zn[z];
while(m>0){
num[kn+ml]=m%10;
ml--;
m=m/10;
}
kn+=l[z];
}
ml=1;
for(i=kl-1;i>=0;i--){
m=xl[i];
km=0;
while(m>0){
km+=num[ml]*po(m-1);
ml++;
m--;
}
z=fn[km];
if(z>=0 && z<26){
p='A'+z;
cout<<p;
}
else{
switch(z){
case 26:cout<<"_";break;
case 27:cout<<",";break;
case 28:cout<<".";break;
case 29:cout<<"?";break;
}
}
}
cout<<endl;
t--;
}
return 0;
}