iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
自我挑戰組

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

Day 0x6 UVa10008 What's Cryptanalysis?

題意

  • 和上篇 Day 0x5 UVa10062 Tell me the frequencies! 有 87% 像
  • 輸入一段文字,分析其 ASCII 與次數
  • 需要注意的點有:
    1. 單測資
    2. 輸入的第一個數字 n 代表接下來的輸入行數
    3. 每行輸入可能含有多個字元 (包含空白)
    4. 輸入的字母大小寫視為同一字元
    5. 按照規則輸出 字母 (大寫) & 次數
      • 按照次數由大到小
      • 同樣次數按照 ASCII 由小到大

解法

  • 讀入代表後續行數的 n 後,要用 getchar()gets() 等方式濾掉換行符號,再開始 while 迴圈存字串
    int n;
    char str[999] = {0};
    
    scanf("%d", &n);
    getchar();
    
    while(n--){
    
        gets(str);
        ...
    }
    
    return 0;
    
  • 每輸入一字串,便用 for 迴圈逐字元處理,因為輸出都是大寫,所以用 if 過濾出小寫字母,透過 ASCII 的特性來存入計算次數的 count 陣列,其餘字元 (包含空白、大寫字母和其他) 直接計算次數即可
    for(i = 0; i < strlen(str); i++){
        if(str[i] >= 'a' && str[i] <= 'z'){
            count[str[i] - 'a' + 'A']++;
        }
        else{
            count[str[i]]++;
        }
    }
    
  • 輸出按照規則,外層跑次數,內層跑大寫字母,該字母有對應的次數便輸出大寫字母 & 次數。這邊要特別注意外層迴圈的起始,不能給 strlen(str),就留給大家思考囉~
    for(i = sizeof(str); i >= 1; i--){
        for(j = 'A'; j <= 'Z'; j++){
            if(count[j] == i){
                printf("%c %d\n", j, i);
            }
        }
    }
    
  • C code
    #include<stdio.h>
    #include<string.h>
    
    int main(){
    
        int n;
        char str[999] = {0};
        int count[91] = {0};
        int i, j;
    
        scanf("%d", &n);
        getchar();
    
        while(n--){
    
            gets(str);
    
            for(i = 0; i < strlen(str); i++){
                if(str[i] >= 'a' && str[i] <= 'z'){
                    count[str[i] - 'a' + 'A']++;
                }
                else{
                    count[str[i]]++;
                }
            }
        }
    
        for(i = sizeof(str); i >= 1; i--){
            for(j = 'A'; j <= 'Z'; j++){
                if(count[j] == i){
                    printf("%c %d\n", j, i);
                }
            }
        }
    
        return 0;
    }
    

上一篇
Day 0x5 UVa10062 Tell me the frequencies!
下一篇
Day 0x7 UVa11417 GCD
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言