[藍橋杯][算法提高]笨小猴

問題描述

Description
笨小猴的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。
但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的機率非常大!
這種方法的具體描述如下:假設maxn是單詞中出現次數最多的字母的出現次數,minn是單詞中出現次數最少的字母的出現次數,如果maxn-minn是一個質數,那麼笨小猴就認爲這是個Lucky Word,這樣的單詞很可能就是正確的答案。
Input
輸入文件只有一行,是一個單詞,其中只可能出現小寫字母,並且長度小於100。
Output
輸出文件共兩行:
第一行是一個字符串,假設輸入的的單詞是Lucky Word,那麼輸出“Lucky Word”,否則輸出“No Answer”;
第二行是一個整數,如果輸入單詞是Lucky Word,輸出maxn-minn的值,否則輸出0。
Sample Input
error
Sample Output
Lucky Word
2

問題思路

  • 1 首先使用一個長度爲26的數組將,每一個字母出現的次數記錄下來
  • 2 從數組中找到最大值和最小值
  • 3 判斷maxn-minn是否爲質數

!! 注意事項

  • 0和1都不是質數
  • "a"和"aabb"這兩種情況要特殊注意一下

完整代碼

#include <iostream>
#include <string>
using namespace std;

bool issuper(int num){
    // !!!0和1都不是質數
    if(num == 0){
        return false;
    }else if(num == 1){
        return false;
    }else{
        for(int i=2;i<num/2;i++){
            if(num%i==0){
                return false;
            }
        }
    }
    return true;
}

int main()
{
    string c;
    int len;
    int ll[26] = {0};
    int maxn=-1,minn=105;
    int judge;

    c = "aaabbb";
    cin >> c;
    len = c.length();

    // 創建一個次數表
    for(int i=0;i<len;i++){
        ll[c[i]-'a']++;
    }
    // 如果是隻有一類字母的情況
    // 遍歷次數表找出最大最小值
    for(int i=0;i<26;i++){
        if(ll[i]==0) continue;
        if(ll[i]>maxn){
            maxn = ll[i];
        }
        if(ll[i]<minn){
            minn = ll[i];
        }
    }
    if(len == maxn) minn=0;
    // 判斷是不是質數
    bool ans = issuper(maxn-minn);
    if(!ans){
        cout << "No Answer" << endl;
        cout << 0 << endl;
    }else{
        cout << "Lucky Word" << endl;
        cout << maxn-minn << endl;
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章