東華OJ基礎題82 密碼分析

2021-10-03 10:18:23 字數 1311 閱讀 3687

問題描述 :

密碼分析學中常常需要統計字元出現的頻度。給定若干行短文,要求按字元出現的頻度由高到低輸出,當兩個字元出現的頻度相同時,按字元大小的順序輸出。

注意:只需要統計英文本母的頻度,非英文本母一律忽略。

輸入說明 :

輸入由多組資料組成。每組資料由一行長度不超過100的字串組成,不區分字母大小寫,如a與a看作同乙個字母。

輸出說明 :

對每組輸入資料都有若干行輸出,每行有兩個輸出資料,第乙個資料為某個大寫字母,第二個資料為該字母出現的頻度,兩個資料之間有乙個空格。輸出順序按字母出現的頻度由高到低輸出,當兩個字母的頻度相同時,按字母大小的順序輸出。兩組輸出之間有一行空行。

輸入範例 :

do what you say, say what you do.

this is a test.

count me 1 2 3 4 5.

輸出範例:

a 4o 4

y 4d 2

h 2s 2

t 2u 2

w 2s 3

t 3i 2

a 1e 1

h 1c 1

e 1m 1

n 1o 1

t 1u 1

總結

1.這個題和基礎題64統計子母有點類似,有些不同就是需要按照頻度輸出。其實不用結構體也能做出來,只要在64的基礎上進行個排序就可以,既然出現在結構體這裡,倒不如構造個。我的思路基本上很清楚:

用字元陣列儲存字串---->進行是否為子母的判斷----->如果為子母統一化成大寫子母----->用結構陣列儲存字串中字元出現的頻度(初始頻度均為0,每次出現乙個字元充分利用字元與數字之間的關係進行頻度的統計)---->按照頻度進行排序----->輸出頻度大於0的即可

2.這裡充分利用了一些函式,isalpha(),islower(),strlen();

3.加油!!

#include

#include

#include

typedef

struct countcount;

intmain()

//進行判斷是否為子母並計算每個字元出現的頻度

for(i=

0;i//按照頻度進行排序從大到小

for(i=

1;i<

26;i++)}

//輸出頻度大於0的即可

for(i=

0;i<

26;i++)}

printf

("\n");

}return0;

}

東華oj 基礎題第32題

32 完數個數 問題描述 完數的定義 如果乙個大於1的正整數的所有真因子 不包括自己的那些因子 之和等於它的本身,則稱這個數是完數,比如6,28都是完數 6 1 2 3 28 1 2 4 7 14。本題的任務是判斷兩個正整數之間完數的個數。輸入說明 第一行是乙個正整數n,表示測試例項的個數,然後就是...

東華oj 基礎題第40題

40 分拆素數和 問題描述 把乙個偶數拆成兩個不同素數的和,有幾種拆法呢?說明 比如10,可以拆成3 7和5 5以及7 3,但是3 7與7 3相同,只算一種,5 5由於兩個素數相同,不計算在內。因此,10的拆法只有一種。輸入說明 首先輸入乙個t 不超過500 然後輸入t個正的偶數,其值不會超過100...

東華oj 基礎題第89題

89 字串壓縮 問題描述 通過鍵盤輸入字母 a z a z 組成的字串,字串長度不超過1000。首先將所有字母統一成小寫字母,然後將字串中連續出現的重複字母進行壓縮,並輸出壓縮後的字串。壓縮規則 1 僅壓縮連續重複出現的字元。比如字串 abcbc 由於無連續重複字元,壓縮後的字串還是 abcbc 2...