统计单词中每个字母出现次数,判断出现最多次数与最少次数之差是否为质数。
OJ: roj
题目 ID: 1407
难度:入门
标签:质数判定字符串统计
创建: 2026-09-30 09:00
更新: 2026-10-05 23:10
题目描述
单词中只含小写字母、长度小于 100。设 Lucky Word 和该差值;否则输出 No Answer 和 0。如输入 error 输出 Lucky Word、2;输入 olympic 输出 No Answer、0。
思路
计数数组统计 26 个字母出现次数,只在出现过的字母上取 maxn 和 minn。差值
参考代码
Python 版:
python
"""笨小猴:统计每个字母出现次数,判断 maxn-minn 是否为质数。"""
import sys
data = iter(sys.stdin.buffer.read().split()) # 输入只有一个 token,顺序消费即可
s = next(data).decode() # 待统计的单词,按空白切分后顺带去掉换行
cnt = [s.count(c) for c in set(s)]
d = max(cnt) - min(cnt)
def is_prime(n: int) -> bool:
return n >= 2 and all(n % i for i in range(2, int(n**0.5) + 1))
print("Lucky Word" if is_prime(d) else "No Answer")
print(d if is_prime(d) else 0)C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-05 23:10
* update_at: 2026-10-05 23:10
*/
// 笨小猴:统计每个字母出现次数,判断 maxn-minn 是否为质数。
#include <cstdio>
#include <cstring>
typedef long long ll;
const int MAXL = 105;
char s[MAXL]; // 输入的单词,只含小写字母
int cnt[26]; // cnt[i] = 字母 'a'+i 在单词中出现的次数
bool appear[26]; // 该字母是否在单词中出现过(未出现的 0 次不参与 minn 统计)
// 试除法判定 n 是否为质数;n 最大不超过单词长度,直接枚举因子即可
bool is_prime(ll n) {
if (n < 2) return false; // 0 和 1 不是质数
for (ll i = 2; i * i <= n; ++i)
if (n % i == 0) return false;
return true;
}
int main() {
scanf("%s", s);
ll len = strlen(s);
for (ll i = 0; i < len; ++i) {
int c = s[i] - 'a';
cnt[c]++;
appear[c] = true;
}
// 只在出现过的字母中取最大、最小次数
ll maxn = -1, minn = -1;
for (int i = 0; i < 26; ++i) {
if (!appear[i]) continue;
if (maxn == -1 || cnt[i] > maxn) maxn = cnt[i];
if (minn == -1 || cnt[i] < minn) minn = cnt[i];
}
ll d = maxn - minn;
if (is_prime(d)) {
printf("Lucky Word\n");
printf("%lld\n", d);
} else {
printf("No Answer\n");
printf("0\n");
}
return 0;
}