# [2024/10/15 CPE讀code筆記] 10008 What’s Cryptanalysis? > 作者: Aria > Oct. 19, 2024 # 題意 input: 第一行: 代表接下來有n行 n為一個正整數 第$2$~$n+1$行是字串 output: 字元+整數 出現頻率越高的字元排列在最前面 # 自己刷過一遍: ## 原始思路: 先用getchar(), putchar() 收字元後 再用case...switch 逐一將26個字母的數量++ 最後用qsort排序 印出 ## 遇到的困難 個人希望的排序方法是能將字母跟字母數對照,想過使用num[0]裝A的字母數,輸出方式為 ```C= for(i=0;i<26;i++) { printf("%c %d",i+65,num[i]); } ``` 但遇到了困難: 1. qsort要排序的是字母的出現頻率的順序,但不希望影響到字母與其出現頻率之間的連結。 2. 希望用struct做但失敗 ## 提醒 1. ascii code A 是65 2. what is qsort? 3. 建struct要更熟悉 # 程式碼: ```c= #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { char letter; // The letter (A-Z) int frequency; // The frequency of the letter } LetterFreq; // Compare function for qsort to sort by frequency in descending order int cmpfunc(const void *a, const void *b) { LetterFreq *lf1 = (LetterFreq*)a; LetterFreq *lf2 = (LetterFreq*)b; return lf2->frequency - lf1->frequency; // Sort by frequency descending } int main() { int n = 0; char x; int i; while(1) { scanf("%d", &n); // Read number of lines // Consume the newline character left after scanf getchar(); // Initialize array to store frequency for each letter LetterFreq letterFreq[26]; for (i = 0; i < 26; i++) { letterFreq[i].letter = 'A' + i; letterFreq[i].frequency = 0; } //原本我想怎麼將頻率數都歸0, array的話會用memset, struct不知道怎麼做很苦惱。 // Process n lines of input for (i = 0; i < n; i++) { while ((x = getchar()) != '\n' && x != EOF) { if (x >= 'A' && x <= 'Z') { letterFreq[x - 'A'].frequency++; // Increment frequency for the letter } } } //雖然之前就知道有這個做法,但一直沒有記的很清楚,這個做法能取代一個一個字母case...switch的做法 // Sort the array of LetterFreq based on frequency qsort(letterFreq, 26, sizeof(LetterFreq), cmpfunc); //仔細觀察qsort的是甚麼? sort之後值怎麼儲存? // Print the sorted result: only print letters with non-zero frequency for (i = 0; i < 26; i++) { if (letterFreq[i].frequency > 0) { printf("%c %d\n", letterFreq[i].letter, letterFreq[i].frequency); } } // Exit after one loop, or modify to handle continuous input as needed break; } return 0; } ``` # Reference: [1] https://cpe.cse.nsysu.edu.tw/cpe/file/attendance/problemPdf/10008.pdf(貢獻題目) [2] ChatGPT(貢獻程式碼)