Online Compiler C

#include <stdio.h> int main() { char a[1001]; scanf("%[^\n]", a); long long int p = 0; while(a[p] != '\0' ) { p++; } int b[26] = {0}; int num; for(int i = 0; i < p; i++) { if(a[i] >= 'a' && a[i] <= 'z') { num = a[i] - 'a'; b[num]++; } if(a[i] >= 'A' && a[i] <= 'Z') { num = a[i] - 'A'; b[num]++; } } int max = b[0], save; for(int i = 25; i >= 0; i--) { if(b[i] >= max) { max = b[i]; save = i; } } char c =save + 'a'; printf("%c", c); return 0; }
这段代码的功能是:读取一行字符串,统计其中每个英文字母(不区分大小写)出现的次数,然后输出出现次数最多的字母(小写形式)。如果有多个字母出现次数相同且都是最大值,则输出字母表中顺序靠后的那个。

代码整体思路正确,但有一个逻辑问题需要注意:

- 在寻找最大值的循环中,你从 `i = 25` 向下遍历到 `0`,并且条件写的是 `if(b[i] >= max)`。这样当遇到相同最大值时,会更新为字母表靠后的字母,符合你的意图。但初始值 `max = b[0]` 可能不是实际的最大值,如果 `b[0]` 不是最大值,后续比较会正确更新,所以这个初始值本身没问题。

- 不过,如果所有字母出现次数都是0(比如输入全是数字或符号),那么 `max` 保持为0,`save` 保持为0,最终会输出 'a',这可能不是期望的行为。但题目可能保证至少有一个字母。

主要需要检查的是:当 `b[0]` 是最大值时,你的循环从25向下到0,遇到 `b[0]` 时条件 `b[0] >= max` 成立(因为 `max` 初始就是 `b[0]`),所以会更新 `save = 0`,这没问题。但如果你希望当最大值相同时保留字母表靠后的,这个逻辑是正确的。

一个潜在的小问题:变量 `p` 的类型是 `long long int`,但数组 `a` 的大小只有1001,用 `int` 就足够了。不过这不是错误。

整体代码功能正确,没有明显错误。