算法学习(五)

1.Caesar Shift Cipher(密码)

说明:密码学是编程中最有趣的分支之一。研究它的算法通常以一种简单的方法开始,这个方法是以著名的罗马皇帝凯撒大帝命名的,他用这个方法来传达他的军事秘密。

我们将在这个问题中练习解密加密消息。这个算法的想法很简单。原文的每一个字母都被另一个字母替换。

下面的规则是:
1.找到字母表里的字母(应该是加密的);

2.进一步移动K位置(在字母表中);

3.从这里拿新信;

4.如果“移动”遇到了算法的结束位置,那么从它的开始就可以继续。

例如,如果K=3,这样A对应D,B对应E,W对应Z,Z对应C,如下表:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

| | | | | | | | | | | | | | | | | | | | | | | | | |
V V V V V V V V V V V V V V V V V V V V V V V V V V 

D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
所有当信息为 VENI VIDI VICI.时,被编码为 YHQL YLGL YLFL.
另一方面,加密的信息应该被“移回去”解码,或者是26-K的移动,这是相同的。
因此,如果我们有编码的消息 HYHQ BRX EUXWXV,我们可以应用26-K=26-3=23的转换,找到原始文本,即是 EVEN YOU BRUTUS.
Input data 将包含两个整数-加密文本行和的 K 值的数量
接着将包含加密的文本,组成的拉丁文大写字母 A到Z,每一行被终止点。紧急情况下应解码的。答案应包含解密后的消息 (在单个行,没有线分裂需要)。
input data:
2 3
YHQL YLGL YLFL.
HYHQ BRX EUXWXV.

answer:
VENI VIDI VICI. EVEN YOU BRUTUS.

代码如下:

 1 Arys =['MXKKTLOKRJY GXK MUTK TUC ZNK YKIXKZ UL NKGZNKX GRK GTJ LUXMOBK AY UAX JKHZY.',
 2 'ZNK UTIK GTJ LAZAXK QOTM GTJ YU EUA ZUU HXAZAY.',
 3 'IGRRKJ OZ ZNK XOYOTM YAT RUBKYZ ZNUA SK VKZKX GXK CUTJKXY SGTE ZURJ.',
 4 'GY KGYE GY REOTM CNU CGTZY ZU ROBK LUXKBKX OT GTIOKTZ VKXYOG ZNKXK CGY G QOTM.',
 5 'G TOMNZ GZ ZNK UVKXG ZNK JKGJ HAXE ZNKOX UCT JKGJ.',
 6 'G JGE GZ ZNK XGIKY MOBK EUAX XUUQY HAZ TUZ JORGXGS.']
 7 
 8 K = 6
 9 alphabet1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'  # 原始字母表
10 alphabet2 = alphabet1[K:] + alphabet1[:K]  # 移动后的字母表
11 
12 
13 for TEXT1 in Arys:
14     TEXT2 = TEXT1[:-1]
15     TEXT = TEXT2.split(' ')  # 把文本分成单个字符串,即一个个单词'ZNK', 'GTJ'
16     Arrays = []
17     for word in TEXT:
18         List = []  # 把单个单词分成,一个个字符'Z', 'N', 'K'
19         for old in word:
20             if old in alphabet2:
21                 new = alphabet1[alphabet2.index(old)]   # 找到对应字母
22             List.append(new)
23         new_word = ''.join(List)  # 合并成单词
24         Arrays.append(new_word)
25     Ans = '{}{}'.format(' '.join(Arrays), '.')  # 按要求格式化字符串,末尾有逗号'.'
26     print(Ans, end=' ')
27   
28 # 输出结果: GREENFIELDS ARE GONE NOW THE SECRET OF HEATHER ALE AND FORGIVE US OUR DEBTS. THE ONCE AND FUTURE KING AND SO YOU TOO BRUTUS. CALLED IT THE RISING SUN LOVEST THOU ME PETER ARE WONDERS MANY TOLD. 
AS EASY AS LYING WHO WANTS TO LIVE FOREVER IN ANCIENT PERSIA THERE WAS A KING. A NIGHT AT THE OPERA THE DEAD BURY THEIR OWN DEAD. A DAY AT THE RACES GIVE YOUR ROOKS BUT NOT DILARAM.

   还可以用另外一种方法,通过ord('A'),找到对应字符的ASCII值,通过加减K值,得到新的字符。但要注意大小写,大写字母的ASCII值在65到90,注意分条件。

 

2.Triangle Area(三角形面积)

说明:能够计算三角形的面积是非常重要的,因为许多更复杂的任务通常很容易被简化成这样(我们以后也会用到它)。已知的最古老的方法之一是Heron公式,它把三角形边的长度作为输入。

在这个问题中,你要写一个程序,它使用三角形顶点的X和Y坐标。所以你可以用这个公式或者找到另一个。

Input data 将包含要处理的三角形的数量。
下一行将包含6个值,依次是 X1 Y1 X2 Y2 X3 Y3,描述一个三角形的三个顶点。
答案应该给出由空间分隔的三角形区域(预计精度为1e-7)。

例如:

data:
3
1 3 9 5 6 0
1 0 0 1 10000 10000
7886 5954 9953 2425 6250 2108

answer:
17 9999.5 6861563

海伦公式:海伦公式利它是利用三角形的三条边的边长直接求三角形面积的公式。表达式为:S=√p(p-a)(p-b)(p-c),它的特点是形式漂亮,便于记忆。

  假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:S=√p(p-a)(p-b)(p-c)

  公式里的p为半周长:p=(a+b+c)/2,所有只要通过三个点求出三角形的三个边长,就可以计算三角形的面积了。

代码如下:

 1 import math #导入math模块,需要用到sqrt开平方
 2 
 3 Arrays = [[1407, 1016, 6823, 9818, 5982, 9430],
 4 [7789, 3696, 6561, 5583, 1463, 4274],
 5 [3235, 9476, 4992, 822, 4024, 4507],
 6 [5970, 7162, 352, 8567, 9296, 1582],
 7 [5066, 2462, 8114, 7451, 4732, 2113]]
 8 
 9 
10 for i in range(len(Arrays)):
11     a = math.sqrt((Arrays[i][0] - Arrays[i][2]) ** 2 + (Arrays[i][1] - Arrays[i][3]) ** 2) # 计算三角形的边长
12     b = math.sqrt((Arrays[i][2] - Arrays[i][4]) ** 2 + (Arrays[i][3] - Arrays[i][5]) ** 2)
13     c = math.sqrt((Arrays[i][4] - Arrays[i][0]) ** 2 + (Arrays[i][5] - Arrays[i][1]) ** 2)
14     p = (a + b + c) / 2  # 求半周长
15     S = math.sqrt(p * (p - a) * (p - b) * (p - c)) # 用海伦公式计算三角形面积
16     print(S, end=' ')
17 #输出结果:2650536.9999999963 5613689.000000002 951263.5000000321 13337704.999999976 301287.0000000146

 

posted @ 2017-08-16 19:36  ZT1994  阅读(734)  评论(0编辑  收藏  举报