一、个人解答
#include<stdio.h>
#include<string.h>int prime(int num);int main() {char max = 'a', min = 'z';int maxn=0, minn=1000;char str[100];int num[26] = { 0 };fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] = '\0';for (int i = 0; str[i] != '\0'; i++) {num[str[i] - 'a']++;}for (int j = 0; j <= 25; j++) {if (num[j] < minn && num[j] != 0) {minn = num[j];}}for (int k = 0; k <= 25; k++) {if (num[k] > maxn) {maxn = num[k];}}if (prime(maxn - minn)) {printf("Lucky Word\n");printf("%d", maxn - minn);}else {printf("No Answer\n0");}return 0;
}int prime(int num) {if (num <= 1) {return 0;}for (int k = 2; k < num; k++) {if (num % k == 0) {return 0;}}return 1;
}
二、代码相关
该代码中我觉得最值得回味的就是minn数值的确定,因为需要得知字符串中各个字母的重复次数最低的,那么按照最朴素的方式就是把每个字符与字母表进行判断,记下每个字母的出现次数,出现次数为0的不算,也就得出minn了。但在题解中,我看到了更简便的方式:
for (int i = 0; str[i] != '\0'; i++) {num[str[i] - 'a']++;}
太妙了!小白真的狂喜,当然我自己应用起来都不是很熟练,所以需要详细解读。
在前面我将num[]数组定义num[26],这是因为str[i]中存储的都是小写字母,所以str[i]-'a'的范围在0~25之间。好了,解释清楚这一点,我们就知道:
当str[i]=='a'时,num[str[i]-'a']对应为num[0],后缀一个++,也就表示字符'a'出现一次。
同理,当str[i]=='b'时,表示字符'b'出现一次。从字符'a'到字符'z'都是如此。
num[i]是从num[0]~num[25]到的,其中存储的数值一一对应字符'a'~'z'出现的次数。