zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    hdu1240 bfs 水题
    hdu 2102 BFS
    gym 101081E Polish Fortress 几何
    Gym 101081K Pope's work dp
    hdu 6188 贪心
    hdu 6186 水
    Codeforces Round #430 (Div. 2) A B 水 C dfs,思维 D trie,二进制
    hdu6152 拉姆齐定理
    hdu6165 缩点,dfs
    hdu6153 扩展KMP
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7468434.html
Copyright © 2011-2022 走看看