对码当歌,猿生几何?

【NOIP2012 提高组 day1】Vigenère密码

题目

这里写图片描述
这里写图片描述


题解

–一道简单的模拟题,不用把这么大一个表都打下来,可以发现规律的:
m=c-(k-‘a’)  ||  m=c-(k-‘A’) 具体看c的大小写
如果减过头了,就强行搬到z去:
c=’z’-(‘a’-c-1) || c=’Z’-(‘A’-c-1)
–剩下一点细节问题是字符串都有的坑,自己注意一下啦


代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int MAXN=105;string k;char m,c;int now;int main(){//  freopen("vigenere.in","r",stdin);//  freopen("vigenere.out","w",stdout);cin>>k;
    getchar();while(scanf("%c",&m)){if(!(m>='a'&&m<='z')&&!(m>='A'&&m<='Z'))break;if(k[now]>='a'&&k[now]<='z')
            c=m-(k[now]-'a');else if(k[now]>='A'&&k[now]<='Z')
            c=m-(k[now]-'A');if(m>='a'&&m<='z'&&c<'a')
            c='z'-('a'-c-1);else if(m>='A'&&m<='Z'&&c<'A')
            c='Z'-('A'-c-1);

        now++;if(now>=k.size())
            now=0;printf("%c",c);
    }return 0;
}

           

阅读更多