Vigenère 密码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vigenère 密码相关的知识,希望对你有一定的参考价值。
略简单的字符串+模拟。
原题链接:https://www.luogu.org/problem/show?pid=1079#sub
如果你对那个图感到懵逼,那属于正常,但没关系,这个图其实作用不大,我们需要的是找到字符串的规律。
可以发现,每一个字母都代表一个数字,从a到z分别代表0到25,而明文和密文的转换是通过一个减法,用密钥减去这个代表数字,得到一个数,这个数对应的ascii字符即为明文。
有几个细节问题。一个是密钥不够长的问题,这里需要一个预判,如果密钥不够长就把它补长。第二个就是大小写问题,这个好办,判断时大小写都判断就好。
以为这样就完了?并不。。。这样有可能会出现减过头的情况,需要加回来,加一个26就好。
附代码:
1 #include <cstdio> 2 #include <cstring> 3 #define maxn 1005 4 char k[maxn],c[maxn],m[maxn]; 5 int lena,lenb; 6 int main(){ 7 gets(k); 8 gets(c); 9 lena = strlen(k); 10 lenb = strlen(c); 11 if (lena < lenb) 12 for (int i=lena;i<lenb;i++) 13 k[i] = k[i-lena]; 14 int t; 15 for (int i=0;i<lenb;i++){ 16 if (k[i]>=‘A‘ && k[i]<=‘Z‘) 17 t = k[i]-‘A‘; 18 if (k[i]>=‘a‘ && k[i]<=‘z‘) 19 t = k[i]-‘a‘; 20 m[i] = c[i] - t; 21 if (c[i]>=‘A‘ && c[i]<=‘Z‘ && m[i]<‘A‘) 22 m[i]+=26; 23 if (c[i]>=‘a‘ && c[i]<=‘z‘ && m[i]<‘a‘) 24 m[i]+=26; 25 } 26 for (int i=0;i<lenb;i++) 27 printf("%c",m[i]); 28 return 0; 29 }
以上是关于Vigenère 密码的主要内容,如果未能解决你的问题,请参考以下文章