演算法學習(五)

来源:http://www.cnblogs.com/zt19994/archive/2017/08/16/7375341.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在php中有一個 serialize() 函數 可以把數組序列化成字元串進行存儲和傳輸 如果想反序列化這種字元串,在php中只需要一個簡單的unserialize() 函數就可以完成了.但是在golang中可就沒有這麼容易了,非得費個九牛二虎之力,寫上不少代碼才行。 這時候只想感嘆一下,php真的是 ...
  • 使用過SpringMVC的都知道DispatcherServlet,下麵介紹下該Servlet的啟動與初始化。作為Servlet,DispatcherServlet的啟動與Serlvet的啟動過程是相聯繫的。在Serlvet的初始化過程程中,Serlvet的init方法會被調用,以進行初始化。Dis ...
  • 首先,整個頁麵包括:列表數據、數據總數、當前頁數、每頁顯示數據個數、列表總頁數、當前索引數 新建Page類,包含以上6個屬性。其中 總頁數 和 當前索引值 可以通過計算得出,所以可以註釋掉 計算總頁數: 計算當前索引值: 在後臺代碼中設置當前頁面pageNo、每頁多少數據pageSize 在serv ...
  • Java類中對象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。 寫入: 讀取: 註意: 對於任何需要被序列化的對象,都必須要實現介面Serializable,它只是一個標識介面,本身沒有任何成員,只是用來標識說明當前的實現類的對象可以被序列化。 ...
  • 隨著業務變遷/需求變更,JavaEE 應用中會被迫連接多個數據源進行業務處理。 怎樣在不影響原有項目結構的情況下,已最優雅/最簡潔的方式動態切換數據源呢? 本文已一次添加數據源後動態切換實踐為例,描述整個思考和實踐過程,文中如有紕漏,還望指正。 1. 依賴 Spring 動態數據源實現 Spring ...
  • 同一個表單中的內容多次提交到伺服器中。 第一種情況: 提交完表單以後,不做其他操作,直接刷新頁面,表單會提交多次。 - 這種情況產生的根本原因是,Servlet處理完請求以後,直接轉發到目標頁面。 - 這樣整一個業務,只發送了一次請求,那麼當你在瀏覽器中點擊刷新按鈕或者狂按f5會一直都會刷新之前的請 ...
  • python的應用範圍和優勢、變數、數據類型、if、while ...
  • 寫文件與讀文件類似,可以是以位元組為單位寫入,可以是以字元為單位寫入。 對應讀操作FileOutputStream是以位元組為單位進行寫入的: 這裡只是簡單替換,如果想實現追加的話只需要這樣寫FileOutputStream(aFile,true);把第二個參數寫為true就可以了。 FileWrite ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...