解题思路:
解这类需要构建字母映射的加密/解密问题,核心在于正确且无冲突地构建映射表,并利用该表进行解码。
注意事项:
这个问题所描述的加密规则是这样的:
1.字母映射:每个字母仅对应另一个唯一的字母,即加密和解密所用的替换表,每个大写字母从 'A' 到 'Z' 都映射到另一个特定的字母(可能是自己)。
2.无二义性:不同的原文字符不能映射到相同的加密字符,并且每个加密字符有且仅有一个原文字符对应。
3.唯一性:每个字母的映射是唯一的,不允许出现多个字母映射到同一个字母。
举例说明:
输入:
AB
CD
DCBA
这里提供了两个字符串的映射:
A -> C
B -> D
根据这个规则,解码 DCBA:
D -> B
C -> A
B -> ? (无法映射,因为 B 在原文中没有相应的加密对)
A -> ? (无法映射,因为 A 在原文中没有相应的加密对)
在这种情况,程序会打印 Failed 因为不是所有字母都有对应关系。
这套规则确保了加密和解密过程的可靠性和唯一性,避免了二义性和冲突。
参考代码:
#include<stdio.h>
#include<string.h>//字符串头文件
int main()
{
char arr1[101];//密文
char arr2[101];//明文
char arr3[101];//加密的消息,需要翻译为明文
char arr4[26]={0};//定义并初始化数组来存储字母到其密字的映射关系。26个英文字母
char arr5[26]={0};//定义并初始化数组来判断某个字母是否已经被映射为密字,也是26大小
scanf("%s %s %s",arr1,arr2,arr3);//输入翻译规则—密文和明文,拿到的密文消息
//将字符型转换为整型
int len1=strlen(arr1);//密文
int len2=strlen(arr2);//明文
int len3=strlen(arr3);//消息
//循环遍历,构建映射表
for(int i=0;i<len1;i++)//密文
{
int arr6=arr1[i]-'A';//arr6是当前加密字符在arr4数组中的索引(序号)
int arr7=arr2[i]-'A';//当前原始字符在arr2数组中的索引(序号)
//判断,通过arr4数组将加密字符映射到原始字符
//第一种情况
//(1)还没有设置加密字符
if(arr4[arr6]==0)//如果加密字符还未被设置
{
if(arr5[arr7])//原文为真,表示该原始字符已经被用在密字
{
printf("Failed\n");//存在冲突,输出Failed
return 0;
}
arr4[arr6]=arr2[i];//将原始字符赋给加密字符
arr5[arr7]=1;//设置原始字符arr5[arr7]为真
}
//(2)原文字符没有对应的密文字符
else if(arr4[arr6]!=arr2[i])//如果加密字符arr4[arr6]不为零且不等于原始字符arr2[i]
{
printf("Failed\n");//存在冲突,输出Failed
return 0;
}
}
//检查完整性
//第二种情况
//遍历arr4数组(密文),检查是否所有字母都有对应的密字
for(int i=0;i<26;i++)
{
if(arr4[i]==0)//如果arr4(密文)数组存在未被设置,表示有些字母没有出现在原消息中
{
printf("Failed\n");//输出“Failed”并退出程序
return 0;
}
}
//翻译信息
//循环遍历arr3数组
for(int i=0;i<len3;i++)
{
//通过arr4数组将每个加密字符映射到相应的原始字符并输出
int arr6=arr3[i]-'A';//当前消息在arr6(密文)数组中索引(序号)
printf("%c",arr4[arr6]);//输出对应消息的密文
}
printf("\n"); //最后输出一个新行
return 0;
}
0.0分
0 人评分
C语言训练-字符串正反连接 (C语言代码)浏览:664 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:827 |
【简单计算】 (C语言代码)浏览:642 |
1908题解浏览:680 |
淘淘的名单 (C语言代码)浏览:1309 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:841 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:477 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:518 |
P1002 (C语言代码)浏览:1028 |
1074题 初学者,求帮忙看下,不知道哪错了浏览:297 |