82 密碼分析
問題描述 :
密碼分析學中常常需要統計字元出現的頻度。給定若干行短文,要求按字元出現的頻度由高到低輸出,當兩個字元出現的頻度相同時,按字元大小的順序輸出。
注意:只需要統計英文本母的頻度,非英文本母一律忽略。
輸入說明 :
輸入由多組資料組成。每組資料由一行長度不超過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
#include
#include
#include
#include
struct frequent
;int
main()
if(islower
(str[i]))
f[str[i]
-'a'
].count++
; f[str[i]
-'a'
].c=str[i]
-'a';}
//結構體排序
for(i=
1;i<
26;i++
) f[j+1]
.c=temp1;
f[j+1]
.count=temp2;}}
for(i=
1;i<
26;i++
) f[j+1]
.c=temp1;
f[j+1]
.count=temp2;}}
for(i=
0;i<
26;i++)}
printf
("\n");
}return0;
}
#總結
1、使用memset初試化結構體值
memset(void *s, int ch,size_tn);中key實際範圍應該在0~~255,因為該函式只能取ch的後八位賦值給你所輸入的範圍的每個位元組,比如int a[5]賦值memset(a,-1,sizeof(int )*5)與memset(a,511,sizeof(int )*5) 所賦值的結果是一樣的都為-1;因為-1的二進位製碼為(11111111 11111111 11111111 11111111)而511的二進位製碼為(00000000 00000000 00000001 11111111)後八位都為(11111111),所以陣列中每個位元組,如a[0]含四個位元組都被賦值為(11111111),其結果為a[0](11111111 11111111 11111111 11111111),及a[0]=-1。
所以memset(data, 1, sizeof(data));會擷取1的後八位進行單個位元組的賦值,1的16進製表示為0x01,那麼將int型別的4位元組中每個位元組賦值為01,即0x01010101;
int data[10]
;memset
(data,0,
sizeof
(data));
// right
memset
(data,-1
,sizeof
(data));
// right
memset
(data,1,
sizeof
(data));
// wrong, data[x] would be 0x01010101 instead of 1
2、使用直接插入排序先對頻率desc,再對字元asc 東華OJ基礎題82 密碼分析
問題描述 密碼分析學中常常需要統計字元出現的頻度。給定若干行短文,要求按字元出現的頻度由高到低輸出,當兩個字元出現的頻度相同時,按字元大小的順序輸出。注意 只需要統計英文本母的頻度,非英文本母一律忽略。輸入說明 輸入由多組資料組成。每組資料由一行長度不超過100的字串組成,不區分字母大小寫,如a與a...
XDOJ 82 密碼強度
閒來無事搞一搞吧。滑稽 問題描述 每個人都有很多密碼,你知道你的密碼強度嗎?假定密碼由大寫字母 小寫字母 數字和非字母數字的符號這四類字元構成,密碼強度計算規則如下 1.基礎分 空密碼 密碼長度為零 0分,非空密碼1分 2.加分項1 密碼長度超過8位,1分 3.加分項2 密碼包含兩類不同字元 1分,...
密碼分析概述
密碼分析的方法主要有以下三種 1 窮舉攻擊 密碼分析者通過試遍所有的金鑰來進行破譯,顯然可以通過增大金鑰量來對抗窮舉攻擊。2 統計分析攻擊 密碼分析者通過分析密文和明文的統計規律來破譯密碼。對抗統計分析攻擊的方法是設法使明文的統計特性與密文的統計特性不一樣。3 解密變換攻擊 密碼分析者針對加密變換的...