【NOIP 2012】Vigenère 密码


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
const int N = 1010;
char m[N],c[N],k[N];
int lenk,lenc;
//m 明 c 密 k 钥 
#define F(x) (x-'A'+1) 
int main()
{
	freopen("vigenere.in","r",stdin);freopen("vigenere.out","w",stdout);
	scanf("%s",k);lenk = strlen(k); 
	scanf("%s",c);lenc = strlen(c);
	int p = 0;
	// M (R) K => C
	// (m+k-1) = c
	bool flag;
	for(int i=0;i<lenc;i++,p++)
	{
		if(p==lenk)p = 0;k[p] = toupper(k[p]);
		if(c[i]>='a'&&c[i]<='z')flag = true,c[i]=toupper(c[i]);
		else flag = false;
		int t = F(c[i])-F(k[p])+1;
		if(t<1)t+=26;
		if(t>26)t-=26;
		m[i] = 'A'-1+t;
		if(flag)m[i]=tolower(m[i]);
	}	
	printf("%s",m);
	return 0;
}
/*
1. R运算忽略参与运算的字母的大小写,并保持字母在明文 M 中的大小写形式;
2. 当明文 M 的长度大于密钥 k 的长度时, 将密钥 k 重复使用。
*/


阅读更多
版权声明:转载请注明原文地址即可,要是本文对您有些许帮助的话,请您在下方点个赞,谢谢啦ヾ(o◕∀◕)ノヾ https://blog.csdn.net/qq_33583069/article/details/52869927
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭