[NOIP2008 提高組] 笨小猴
題目描述
笨小猴的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的機率非常大!
這種方法的具體描述如下:假設maxn是單詞中出現次數最多的字母的出現次數,minn是單詞中出現次數最少的字母的出現次數,如果maxn-minn是一個質數,那麼笨小猴就認為這是個 Lucky Word,這樣的單詞很可能就是正確的答案。
輸入格式
一個單詞,其中只可能出現小寫字母,並且長度小於100。
輸出格式
共兩行,第一行是一個字串,假設輸入的的單詞是 Lucky Word,那麼輸出 Lucky Word
,否則輸出 No Answer
;
第二行是一個整數,如果輸入單詞是 Lucky Word
,輸出maxn-minn
的值,否則輸出 0。
樣例 #1
樣例輸入 #1
error
樣例輸出 #1
Lucky Word
2
樣例 #2
樣例輸入 #2
olympic
樣例輸出 #2
No Answer
0
提示
【輸入輸出樣例 1 解釋】
單詞 error
中出現最多的字母 r 出現了 3 次,出現次數最少的字母出現了 1 次,3-1=2,2是質數。
【輸入輸出樣例 2 解釋】
單詞 olympic
中出現最多的字母 出現了 1 次,出現次數最少的字母出現了 1 次,1-1=0,0 不是質數。
(本處原題面錯誤已經修正)
noip2008 提高第一題
一道有關於字串的題目--
這道題我們大致可以分為以下幾個步驟:
1.輸入一個字串,並遍歷這個字串,設立Numbers陣列(我們暫且可以將Numbes陣列初始化為0),儲存這個字串中出現字元的個數.
2.遍歷這個陣列,並找出這個陣列中最小的,並且字串中出現過的字元的次數的最小值minn和最大值maxn(最小值的判斷有一個坑——那就是我們不能僅僅找出陣列中的最小值,同時這個最小值必須得>0,
表示這個字元在輸入的字串中出現過)
3.定義一個函式,判斷一個整數是否是質數
4.找出最小值和最大值以後,定義diff變數=maxn-minn,判斷這個數是否是質數,如果不是質數,第一行輸出"No Answer",第二行輸出0即可。
如果這個數是質數,則第一行輸出"Lucky Word",第二行輸出diff這個變數的值就可以了。
具體可以編譯執行的程式碼如下:
#include <iostream>
#include <cmath>
using namespace std;
// 判斷一個數是否是質數
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
//輸入字串
string s;
cin >> s;
//利用Numbers陣列,來判斷這個字串中出現的字母的次數
int Numbers[26] = { 0 };
for (int i = 0; i < s.size(); i++) {
int n = (s[i] - 'a');
Numbers[n]++;
}
int maxn = 0, minn = 110;
for (int i = 0; i < 26; i++) {
if (Numbers[i] > maxn) maxn = Numbers[i];
//在這裡一定要注意,不能直接比對Numbers陣列中最小的那位,而是Numbers陣列中最小的那位,並且它的值不能等於0(即這個字母至少在字串中出現過一次)
if (Numbers[i] > 0 && Numbers[i] < minn) minn = Numbers[i];
}
int diff = maxn - minn;
if (isPrime(diff)) {
cout << "Lucky Word" << endl;
cout << diff;
}
else {
cout << "No Answer" << endl;
cout << 0;
}
return 0;
}
這道題我想告訴大家的是,並不是在遍歷陣列找最小值的時候,一定只有最小值這個邏輯條件。
比如這道題,不僅要找最小值,並且這個最小值還不能是0,一定要清楚的判斷我們的需求,然後根據這個需求來書寫判斷邏輯