#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char a[1100],b[1100],c[1100],d[1100];//密文,原文,要解密文,解密文
int len,len1,i,j,ret=0;//ret用来表示是否符合规范不符合就ret=-1;
gets(a);
gets(b);//输入
gets(c);
len=strlen(a),len1=strlen(c);//分别的长度
char s[27]={'\0'}; int y[27]={0};
for(i=0;i<len;i++)
{
y[b[i]-'A']=1;//统计字母
}
for(i=0;i<26;i++)
{
if(y[i]==0){//是否出现没出现的字母
ret=-1;
}
}
for(i=0;i<len;i++)
{
for(j=i+1;j<len;j++){
if(b[i]!=b[j]&&a[i]==a[j]){//一个原文字符只能对应一个密文
ret=-1;
}
if(b[i]==b[j]&&a[i]!=a[j]){//一个字符的密文是唯一的
ret=-1;
}
}
}
for(i=0;i<len;i++)
{
s[a[i]-'A']=b[i];//每个字符对应的解
}
for(i=0;i<27;i++)
{
for(j=i+1;j<27;j++)
{
if(s[i]!='\0'&&s[i]==s[j]){ //解的唯一性或者解不存在
ret=-1;
break;
}
}
}
for(i=0;i<len1;i++)
{
if(s[c[i]-'A']=='\0'){
ret=-1;//如果解不存在就ret=-1;
break;
}else{
d[i]=s[c[i]-'A'];//开始解密一一对应 ,存储到d中;
}
}
if(ret==-1)
{
printf("Failed\n");//不合规范
}else if(ret==0){//合规范打印
//printf("%s",d);
for(i=0;i<len1;i++)
{if(d[i]!='\0')
printf("%c",d[i]);//打印 ,也可以用scanf("%s",d);
}
}
这道题需要注意3点
1.原文中必须要有26个大写字母
2.一个原文字符对应一个密文字符且密文字符的解是唯一的
3.不能2个相同原文字符的解不一样,解与原文的关系是一对一,一个原文字符只能有一个解(这个是对第二条的解释)
ac了