題目大意
Cryptanalysis是用來破解某個cryptographic的加密,Cryptanalysis通常涉及了一靜態分析,你的任務就是寫一個簡單的程式去處理他
輸入
第一行的輸入包含一個正的個位數n,這個n表示你接下來會得到的輸入行數。接下來的n行會包含0或是更多的字元(可能包含空白)。這就是你需要分析的資料
輸出
每一行的輸出包含一個大寫的字母並且跟隨著一個空白,然後是一個正整數。該數字表示這個字母出現的次數。大小寫字母被視為一樣的。結果輸出必須要依照出現次數降冪排序,如果字母出現次數相同則依照字母排序,如果該字母不曾出現則不必輸出該字母
程式碼
#include <stdio.h> #include <stdlib.h> void lower(char a[]){ int i=0; for(i=0;i<1024;i++){ if((a[i]>=65)&&(a[i]<=90)){ a[i]=a[i]+32; } } } void sort(int s[],int s2[]){ int i,j,k; for(i=97;i<=122;i++){ for(j=97;j<122;j++){ if(s[j+1]>s[j]){ //變更內容 k=s[j];s[j]=s[j+1];s[j+1]=k; //變更索引 k=s2[j];s2[j]=s2[j+1];s2[j+1]=k; } } } } int main(){ // char s[1024]=""; int i = 0; int set[123]={0}; //取得輸入 while(fgets(s,1024,stdin)!=NULL){ lower(s); //統一轉小寫 for(i=0;i<1024;i++){ if((s[i]>=97)&&(s[i]<=122)){ //對應ascii放入陣列 set[s[i]]++; } } } //宣告並初始化陣列(預備排序索引使用) int setIndex[123]={0}; for(i=97;i<=122;i++){ setIndex[i]=i; } //依照出現次數排序 sort(set,setIndex); //印出結果 for(i=97;i<=122;i++){ if(set[i]>0) printf("%c %dn",setIndex[i]-32,set[i]); } return 0; }
解題概念
1. 先統一將文字轉成小寫
2. 建立一個[123]大小的陣列(s),使用97~122(對應ASCII a~z)格紀錄a~z的出現次數
3. 再建立一個[123]大小的陣列(s2),在97~122格放入數字97~122,用於排序後的索引(a~z)
4. 排序s的同時排序s2
5. 依照格式印出結果