NOIp2012 TG Day1-1 Vigenère 密码

题目描述

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

在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用
C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,
记为 k。 在 Vigenère 密码中,密钥 k 是一个字母串,k=k1k2…kn。当明文 M=m1m2…mn时,
得到的密文 C=c1c2…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

样例输出

Wherethereisawillthereisaway

 

 

 

注释

【数据说明】
对于 100%的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过 1000,且
都仅包含英文字母。
 
 
正式回归OI第二天、、
这题没什么好说的、、
就是写的时候又和去年NOIp一样犯2,写了个加密的、、、
呃、、、当然编的效率和去年比高了些、、、
 
加密:
 1 Var
 2   st1:AnsiSTring;
 3   i,n,l:longint;
 4   a,b:Array[0..1001] of longint;
 5 Begin
 6   Readln(st1);
 7   st1:=Upcase(St1);
 8   l:=Length(st1);
 9   For i:=1 to l do
10     a[i]:=Ord(st1[i])-65;
11   Readln(st1);
12   n:=Length(st1);
13   i:=l+1;
14   Repeat
15     a[i]:=a[i-l];
16     inc(i);
17   Until i>n;
18   For i:=1 to n do
19     Begin
20       if st1[i] in ['A'..'Z'] Then
21         Begin
22           b[i]:=Ord(st1[i])+a[i];
23           if b[i]>90 Then b[i]:=(b[i]-90)+64;
24         End
25       Else
26         Begin
27           b[i]:=Ord(st1[i])+a[i];
28           if b[i]>122 Then b[i]:=(b[i]-122)+96;
29         End;
30     End;
31   For i:=1 to n do
32     Write(Chr(b[i]));
33   Writeln;
34 End.

题目要求的、、解密:

 1 Var
 2   st1:AnsiSTring;
 3   i,n,l:longint;
 4   a,b:Array[0..1001] of longint;
 5 Begin
 6   Readln(st1);
 7   st1:=Upcase(St1);
 8   l:=Length(st1);
 9   For i:=1 to l do
10     a[i]:=Ord(st1[i])-65;
11   Readln(st1);
12   n:=Length(st1);
13   i:=l+1;
14   Repeat
15     a[i]:=a[i-l];
16     inc(i);
17   Until i>n;
18   For i:=1 to n do
19     Begin
20       if st1[i] in ['A'..'Z'] Then
21         Begin
22           b[i]:=Ord(st1[i])-a[i];
23           if b[i]<65 Then b[i]:=90-(64-b[i]);
24         End
25       Else
26         Begin
27           b[i]:=Ord(st1[i])-a[i];
28           if b[i]<97 Then b[i]:=122-(96-b[i]);
29         End;
30     End;
31   For i:=1 to n do
32     Write(Chr(b[i]));
33   Writeln;
34 End.
 纯属细节题、、
 
posted @ 2013-09-18 17:34  Iris.Catch-22.S、`  阅读(360)  评论(0编辑  收藏  举报