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 }
  • 相关阅读:
    Liunx服务器部署MySQL
    TCP/IP协议与Http、RPC和Socket
    InfluxDB简介
    nodeJS中的包
    什么是Solr,它能为我们解决什么问题,怎么用?
    tp基础补充
    用户流程
    已有模板与tp框架的结合 (前台)
    tp模板基础
    Smarty小结提纲
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7468434.html
Copyright © 2011-2022 走看看