cpe練習筆記 UVa10008 What’s Cryptanalysis?




題目大意
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. 依照格式印出結果

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料