2014年1月3日 星期五

[UVA]What's Cryptanalysis?

CPE10402、UVA10008 程式解題。












































解題觀念:


這題要輸入句子後,統計各個字母的出現次數,且不分大小寫

所以要處理字母大小寫,看是要全部轉成小寫還是全部轉成大寫。

依照出現次數由大到小印出,如果次數相同,則先印出排序較前的字母。次數為0不印出。

一個句子裡面可能會有空白列,所以要讀取( .nextLine() )並處理空白

(此版本為第一次寫出的程式版本,未整理可能有些許瑕疵。)




解題步驟:

宣告整數a,讓使用者設定要輸入幾句句子;整數MAX統計總共有幾個字母

宣告字串s,存放句子;宣告字元c,等等抓取字元後存放用。

宣告陣列count,存放各個字母並統計次數

整數a,輸入要有幾個句子。同時為for迴圈次數設定。

字串s,輸入句子,將所有空白處理掉( .replaceAll() ),再將全部轉為大寫( .toUpperCase() )。

進入for迴圈,讀取字元後設定給c。

進入if判斷字元c是否為A~Z字母,如果是則存放到相對應的陣列格子並統計次數
( if c=A,count[A-'A'] = count[65-65] = count[0] ,其他字母以此類推。)

 MAX要統計所有字母的個數,所以每當讀取到一個字母就要+1。

處理完所有句子後,進入下一個雙層for迴圈,執行印出動作。

從MAX開始往下遞減,判斷陣列的格子從A開始到Z,是否有對應到相同次數。

因為是從最大次數向下遞減,所以會依照出現次數由大到小印出;

陣列格子也從A開始判斷,所以能夠依照排順序依序印出。

( *  要記得將 j 強轉成字元,不然直接輸出會是數字。)


EX:

1
To be or not to be.

將所有空白去除==>Tobeornottobe.

轉成大寫==>TOBEORNOTTOBE.

進入for迴圈,讀取字元,c = T。 進入if判斷式,T>=A && T<=Z,成立。

存入陣列,coumt[T-'A'] = count[84-65] = count[19] ++。MAX ++。
 ( 其他字母以此類推,我就跳過囉! )

進入下面雙層for迴圈,此時MAX = 13。

從13開始往下遞減,進入內層for迴圈,從A格子開始對應次數。

如果符合判斷式則印出,不符合則continue。


By  小K







沒有留言:

張貼留言