题解:P1079 [NOIP2012 提高组] Vigenère 密码

· · 题解

思路很简单,只要我们观察题目中最下面的表格就可以知道。一个字符串的第 i 项加上密钥的第 i 项所对应的字母表中的第 x 个字符(加上 x)得到的就是我们加密后的字符串。所以我们可以定义一个指针 j,表示明文的第 i 个字符要加上 k_j,然后再注意一下大小写即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
    string k;
    string c;
    cin>>k>>c;
    int now=0; 
    for(int i=0;i<c.size();i++)
    {
        char ch=k[now];
        int a;
        if(ch>='A'&&ch<='Z') a=ch-'A';
        if(ch>='a'&&ch<='z') a=ch-'a';
        char b=c[i]-a;
        if(c[i]>='A'&&c[i]<='Z')
        {
            if(b<'A') 
            {
                b+=26; 
            }
        }           
        if(c[i]>='a'&&c[i]<='z')
        {
            if(b<'a') 
            {
                b+=26;
            }       
        }
        cout<<b;
        now++;
        if(now>k.size()-1) now=0;//如果指针超过了长度就回到第0个字符
    }
    return 0;
}