C语言 解译电文密码
Posted 奕兴_Victor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 解译电文密码相关的知识,希望对你有一定的参考价值。
有一行电文,已按下面规律译成密码:
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编写程序将密码译回密码和原文。
解析:
可以定义一个数组ch,在其中存放电文。如果字符ch[j]是大写字母,则它是26个字母中的第(ch[j]-64)个大写字母。即第2个字母。按密码规定应将它转换为第66,他应是字母表中第(66-64),即第2个字母。按密码规定应将它转换为第(26-i+1)个大写字母,即第(26-2+1)=25个大写字母。而26-i+1=26-(ch[j]-64)+1=26+64-ch[j]+1,即91-ch[j] (如ch[j]等于’B’,91-‘B’=91-66=25,ch[j]应将它转换为第25个大写字母)。该字母的ASCII码为91-ch[j]+64,而91-ch[j]的值为25,因此91-ch[j]+64=25+64=89,89是’Y’的ASCII码。表达式91-ch[j]+64可以直接表示为155-ch[j]。小写字母情况与此相似,但由于小写字母’a’的ASCII码为97,因此处理小写字母的公式应改为:26+96-ch[j]+1+96=123-ch[j]+96=219-ch[j]。
例如,若ch[j]的值为’b’,则其交换对象为219-‘b’=219-98=121,它是’y’的ASCII码。
由于此密码的规律是对此转换,即第1个字母转换为最后一个字母,最后一个字母转换为第1个字母,因此从原文译为密码和从密码译为原文,都是用同一个公式。
方法一:用两个字符数组分别存放原文和密码
#include<stdio.h>
#include<string.h>
int main()
int j,n;
char ch[80],tran[80];
printf("input cipher code:");
gets(ch);
printf("\\ncipher code:%s",ch);
j=0;
while(ch[j]!='\\0')
if((ch[j]>='A')&&(ch[j]<='Z'))
tran[j]=155-ch[j];
else if((ch[j]>='a')&&(ch[j]<='z'))
tran[j]=219-ch[j];
else
tran[j]=ch[j];
j++;
n=j;
printf("\\noriginal text:");
for(j=0;j<n;j++)
putchar(tran[j]);
printf("\\n");
return 0;
方法二:只用一个字符数组
#include<stdio.h>
#include<string.h>
int main()
int j,n;
char ch[80];
printf("input cipher code:");
gets(ch);
printf("\\ncipher code:%s",ch);
j=0;
while(ch[j]!='\\0')
if((ch[j]>='A')&&(ch[j]<='Z'))
ch[j]=155-ch[j];
else if((ch[j]>='a')&&(ch[j]<='z'))
ch[j]=219-ch[j];
else
ch[j]=ch[j];
j++;
n=j;
printf("\\noriginal text:");
for(j=0;j<n;j++)
putchar(ch[j]);
printf("\\n");
return 0;
以上是关于C语言 解译电文密码的主要内容,如果未能解决你的问题,请参考以下文章
26有一行电文,已按下面规律译成密码即第一个字母变成第26个字母,第I个字母变成第(26-i+1)
译密码。为使电文保密,往往按一定规律将其转换成密码,受保人再按约定的规律将其翻译回原文。A变E ,a变e,W,X,Y,Z分别变为A,B,C,D小写字母以此类推
C语言加密练习:第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。