一、个人解答
#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'出现的次数。