1.这道题首先要有一个判断是不是素数的函数,而判断写一个函数就要尽可能的把这个函数写的健壮性要高,(0和1用来判断这个数是不是素数)首先判断小于等于1的数据,肯定不是素数直接返回0,判断2是素数返回1,然后只有是偶数就都不是素数直接返回1,然后接下来从3开始,一次跳过两个数据因为偶数已经全部判断完了,循环到开平方的那个数就可以,开平方之前没有能除以传进来的这个数 ,开平方之后也不会有
2。创建一个数组,用来接受字符的频率(freq)的,freq里面的值初始化为0,数组大小为256(对应ASCII,然后把每个字符强制类型转化为int,作为freq的下标,找到这个下标以后解引用然后自增1,这时字符数组中的
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math.h> int isprime(int n) { if (n <= 1) return 0; if (2 == n) return 1; if (n % 2 == 0) return 0; int i= 1; for (i = 3; i <=sqrt(n); i+=2)//判断是不是一个素数这样写确实可以,效率更高 { //小于1的直接返回,等于二的还有后面偶数的直接返回1,后面只需要判断奇数的就可以 if (n % i == 0) return 0; } return 1; } int main() { char str[100] = { 0 }; scanf("%s", str); int freq[256] = { 0 };//ASCLL频率表 int i = 0; int len = strlen(str); for (i = 0; i < len; i++) { freq[(int)str[i]]++;//这个表达式要看清楚,把每一个字符转换到对应的数组中,然后再自增 //相当于把数组中的数据映射到一个数组中 } int max = 0; int min = 100; for (i = 0; i < 256; i++) { if (freq[i] > 0)//只比较大于0的数据 { if (freq[i] > max) max = freq[i]; if (freq[i] < min) min = freq[i]; } } int sub = max - min; if (isprime(sub)) printf("Lucky Word\n%d",sub); else { printf("No Answer\n%d", sub); } return 0; }每个字符的频率都在freq表中,进行max和min取值即可