笨小猴

GitHub跳转原题关系图返回列表

统计单词中每个字母出现次数,判断出现最多次数与最少次数之差是否为质数。

OJ: roj

题目 ID: 1407

难度:入门

标签:质数判定字符串统计

创建: 2026-09-30 09:00

更新: 2026-10-05 23:10

题目描述

单词中只含小写字母、长度小于 100。设 maxnmaxn 为出现次数最多字母的出现次数,minnminn 为出现次数最少字母的出现次数(只统计出现过的字母)。若 maxn−minnmaxn - minn 是质数,输出两行:Lucky Word 和该差值;否则输出 No Answer 和 0。如输入 error 输出 Lucky Word、2;输入 olympic 输出 No Answer、0。

思路

计数数组统计 26 个字母出现次数,只在出现过的字母上取 maxn 和 minn。差值 dd 试除判质数,d<2d < 2(如 0 或 1)直接判非质数。

参考代码

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;
}