P1079 Vigenère 密码

题目描述

16 世纪法国外交家 BlaisedeVigenère 设计了一种多表密码加密算法――Vigenère密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。

在密码学中,我们称需要加密的信息为明文,用 M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。 在 Vigenère密码中,密钥k是一个字母串,k=k1,k2,,kn。当明文 M=m1,m2,,mn时,得到的密文 C=c1,c2,,cn,其中ci=mi®ki,运算®的规则如下表所示:

Vigenère 加密在操作时需要注意:

  1. ®运算忽略参与运算的字母的大小写,并保持字母在明文M 中的大小写形式;

  2. 当明文 M 的长度大于密钥 k 的长度时,将密钥 k重复使用。

例如,明文 M=Helloworld,密钥k=abc 时,密文 C=Hfnlpyosnd

输入格式

共 2 行。

第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。

第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。

输出格式

一个字符串,表示输入密钥和密文所对应的明文。

输入输出样例

输入 #1
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm 
输出 #1
Wherethereisawillthereisaway 

说明/提示

【数据说明】

对于 100%的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过1000,且都仅包含英文字母。

NOIP 2012 提高组 第一天 第一题

思路

简单的字符串模拟,输出长度应注意与len2相等

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=1010;

int len1,len2;
char k[N],s[N],ans[N];

int main() {
	scanf("%s",k);
	scanf("%s",s);
	len1=strlen(k);
	len2=strlen(s);
	if(len1<len2)
		for(int i=len1; i<len2; i++)
			k[i]=k[i-len1];
	for(int i=0,j; i<len2; i++) {
		if(k[i]>='A'&&k[i]<='Z')
			j=k[i]-'A';
		if(k[i]>='a'&&k[i]<='z')
			j=k[i]-'a';
		ans[i]=s[i]-j;
		if(s[i]>='A'&&s[i]<='Z')
			if(ans[i]<'A')
				ans[i]+=26;
		if(s[i]>='a'&&s[i]<='z')
			if(ans[i]<'a')
				ans[i]+=26;
	}
	//for(int i=0; i<len2; i++)
		printf("%s",ans);
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/mysh/p/11358157.html