iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
自我挑戰組

用 C & C++ 帶你手把手解 UVa 一顆星選集系列 第 5

Day 0x5 UVa10062 Tell me the frequencies!

題意

  • 對每一列輸入,輸出各字元的 ASCII & 次數
  • 需要注意的點有:
    1. 重複輸入,止於 EOF
    2. 每一行輸入對應一輸出,長度 ≦ 1000
    3. 輸入的每個字元:32 ≦ ASCII ≦ 127
    4. 每行輸出包含 ASCII & 次數
      • 按照次數由小到大
      • 同樣次數按照 ASCII 由大到小
    5. 每筆輸出間含一空白行

解法

  • while 迴圈重複輸入,用 gets() 來讀入空白和控制 EOF 結束,並存到 str 字元陣列裡
    char str[1001] = {0};
    
    while(gets(str)){
        ...
    }
    
  • bool 型態 (記得 include<stdbool.h>) 的 flag 變數當作開關,控制每筆輸入間的空白行
    • 第一筆輸出後若有第二筆輸入進來,才會輸出空白行
    #include<stdbool.h>
    
    bool flag = false;
    
    while(gets(str)){
    
        if(flag){
            printf("\n");
        }
    
        flag = true;
        ...
    }
    
  • 再開一個整數陣列,index 代表 ASCII,value 存入次數;用 for 迴圈分別處理輸入的每個字元
    int count[128] = {0};
    
    for(i = 0; i < strlen(str); i++){
        count[str[i]]++;
    }
    
  • 按照題目要求的順序輸出
    • 外層 for 迴圈跑次數
    • 內層 for 迴圈跑 ASCII
    • if 判斷,如果該次數有對應的 ASCII 就輸出
    for(i = 1; i <= strlen(str); i++){  // the number of each ASCII
        for(j = 127; j >= 32; j--){      // counter of ASCII
            if(count[j] == i){
                printf("%d %d\n", j, i);
            }
        }
    }    
    
  • C Code
    #include<stdio.h>
    #include<stdbool.h>
    
    int main(){
    
        char str[1001] = {0};
        int i, j;
        bool flag = false;
    
        while(gets(str)){
    
            if(flag){
                printf("\n");
            }
    
            int count[128] = {0};
            flag = true;
    
            for(i = 0; i < strlen(str); i++){
                count[str[i]]++;
            }
    
            for(i = 1; i <= strlen(str); i++){  // the number of each ASCII
                for(j = 127; j >= 32; j--){      // counter of ASCII
                    if(count[j] == i){
                        printf("%d %d\n", j, i);
                    }
                }
            }    
        }
    
        return 0;
    }
    

上一篇
Day 0x4 UVa10041 Vito's Family
下一篇
Day 0x6 UVa10008 What's Cryptanalysis?
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言