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 }
原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7468434.html