1 条题解

  • 0
    @ 2026-8-18 11:48:30

    思路

    三步走:

    1. 统计每个字母出现几次——开一个 26 格的数组 cnt[26],cnt[c - 'a']++;
    2. 找出出现次数的最大值 maxn 和最小值 minn;
    3. 判断 maxn - minn 是不是质数(注意 0 和 1 不是质数,2 是质数)。

    代码

    #include <stdio.h>
    #include <string.h>
    
    int isPrime(int n) {
        if (n < 2) return 0;
        for (int i = 2; i * i <= n; i++)
            if (n % i == 0) return 0;
        return 1;
    }
    
    int main() {
        char word[105];
        int cnt[26] = {0};
    
        scanf("%s", word);
        int len = strlen(word);
    
        for (int i = 0; i < len; i++)
            cnt[word[i] - 'a']++;
    
        int maxn = 0, minn = 105;
        for (int i = 0; i < 26; i++) {
            if (cnt[i] > maxn) maxn = cnt[i];
            if (cnt[i] > 0 && cnt[i] < minn) minn = cnt[i]; // 只看出现过的字母
        }
    
        int diff = maxn - minn;
        if (isPrime(diff))
            printf("Lucky Word\n%d\n", diff);
        else
            printf("No Answer\n0\n");
        return 0;
    }
    

    易错点

    • 没出现过的字母次数是 0,不能算进 minn,否则 minn 永远是 0。
    • 0 和 1 不是质数,判质数函数开头要拦住 n < 2 的情况。
    • 1

    信息

    ID
    6
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者