1. 程式人生 > >“雞翁一值錢5,雞母一值錢3,雞雛三值錢1。百錢買百雞,問雞翁、母、雛各幾何?”java窮舉法解題

“雞翁一值錢5,雞母一值錢3,雞雛三值錢1。百錢買百雞,問雞翁、母、雛各幾何?”java窮舉法解題

窮舉法概述(這是引用百度的介紹
窮舉法是一種針對於密碼的破譯方法。這種方法很像數學上的“完全歸納法”並在密碼破譯方面得到了廣泛的應用。簡單來說就是將密碼進行逐個推算直到找出真正的密碼為止。比如一個四位並且全部由數字組成其密碼共有10000種組合,也就是說最多我們會嘗試9999次才能找到真正的密碼。利用這種方法我們可以運用計算機來進行逐個推算,也就是說用我們破解任何一個密碼也都只是一個時間問題。 當然如果破譯一個有8位而且有可能擁有大小寫字母、數字、以及符號的密碼用普通的家用電腦可能會用掉幾個月甚至更多的時間去計算,其組合方法可能有幾千萬億種組合。這樣長的時間顯然是不能接受的。其解決辦法就是運用字典,所謂“字典”就是給密碼鎖定某個範圍,比如英文單詞以及生日的數字組合等,所有的英文單詞不過10萬個左右這樣可以大大縮小密碼範圍,很大程度上縮短了破譯時間。 在一些領域,為了提高密碼的破譯效率而專門為其製造的
超級計算機
也不在少數,例如IBM美國軍方製造的“颶風”就是很有代表性的一個。 窮舉法解題,就是按照某種方式列舉問題答案的過程。針對問題的資料型別而言,常用的列舉方法一有如下三種: (1)順序列舉 是指答案範圍內的各種情況很容易與自然數對應甚至就是自然數,可以按自然數的變化順序去列舉。 (2)排列列舉 有時答案的資料形式是一組數的排列,列舉出所有答案所在範圍內的排列,為排列列舉。 (3)組合列舉 當答案的資料形式為一些元素的組合時,往往需要用組合列舉。組合是無序的。 例子如下:在公元五世紀我國數學家張丘建在其《算經》一書中提出了“百雞問題 ”: 這個數學問題的數學方程可列出如下: Cock+Hen+Chick=100 Cock*5+Hen*3+Chick/3=100 顯然這是個不定方程,適用於窮舉法求解。依次取Cock值域中的一個值,然後求其他兩個數,滿足條件就是解。 該問題用java程式演算法如下: int Cock, Hen, Chick; /* 定義公雞,母雞,雞雛三個變數 */
Cock = 0;
while (Cock <= 19) /* 公雞最多不可能大於19 */
{
Hen = 0;
while (Hen <= 33) /* 母雞最多不可能大於33 */
{
Chick = 100 - Cock - Hen;
if (Cock * 15 + Hen * 9 + Chick == 300)/* 將數量放大三倍比較  這裡隨著倍數放大答案也會變多*/
System.out.println("\n公雞=" + Cock + "母雞=" + Hen + "雛雞=" + Chick);
Hen = Hen + 1;
}
Cock = Cock + 1;

}

執行結果: 


公雞=0母雞=25雛雞=75


公雞=4母雞=18雛雞=78


公雞=8母雞=11雛雞=81


公雞=12母雞=4雛雞=84