1.Caesar Shift Cipher(密碼) 說明:密碼學是編程中最有趣的分支之一。研究它的演算法通常以一種簡單的方法開始,這個方法是以著名的羅馬皇帝凱撒大帝命名的,他用這個方法來傳達他的軍事秘密。 我們將在這個問題中練習解密加密消息。這個演算法的想法很簡單。原文的每一個字母都被另一個字母替換。 ...
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