题目是:笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
示例:
输入:error
输出:lucky Word
2
说明:出现最多的3-出现最少的1=2是质数
输入:beijing
输出:No Answer
0
说明:出现最多的2-出现最少的1=1不是质数
(如果结果是No Answer,那么最后输出的第二行结果一定是0.)
上代码:
#include
#include
#include
bool IsPrimer(int number)//判断一个数是否为质数
{
if(number==0 || number==1)
{
return false;//0 1不是质数
}
if(number==2)
{
return true;//2是质数
}
for(int i=2;i<number;i++)
{
if(number%i==0)
{
return false;//能整除不是质数
}
}
return true;//否则是质数
}
void Swap(int *a,int *b)//对两个变量进行交换
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void BubbleSort(int *arr,int len)//冒泡排序比较数组大小
{
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if(arr[j]>arr[j+1])
{
Swap(&arr[j],&arr[j+1]);//如果前面的数大于后面的将两个数的位置交换
}
}
}
}
int main()
{
char arr[100];
char book1[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z'};//将可能出现的字母列举出来
int book2[26]={0};//类似于一个桶,将字母出现的次数对应在一个整型的桶中
int *book3=(int *)malloc(100*sizeof(int));//将桶中不为0的数字(对应字母出现的次数)放到另外一个数组中
for(int i=0;i<100;i++)
{
book3[i]=0;//将新的数组元素全部初始化为0
}
int maxn,minn;
int j=0;
fgets(arr,100,stdin);
int len=strlen(arr);
for(int i=0;i<len;i++)
{
for(int j=0;j<26;j++)
{
if(arr[i]==book1[j])
{
book2[j]++;//计算对应位置的字母出现的次数
}
}
}
for(int i=0;i<26;i++)
{
if(book2[i]!=0)
{
book3[j]=book2[i];//将出现的字母个数按照该字母对应的位置存放到新的数组中
j++;
}
}
BubbleSort(book3,j);//对新的数组元素排序 从小到大排
maxn=book3[j-1];//最后一个元素为出现次数最多的
minn=book3[0];//第一个元素为出现次数最少的
int num=maxn-minn;
if(IsPrimer(num))//是质数
{
printf("Lucky Word\n");
printf("%d\n",num);
}
else//不是质数
{
printf("No Answer\n");
printf("%d\n",0);
}
system("pause");
return 0;
}
}
这道题本来就不是很难,但我做了好几遍系统都没有编译通过,最后下载了测试之后才发现如果结果是No Answer的话输出的第二行就是0,一直都以为是maxn-minn,导致系统一直给我扣分,个人感觉这个题目没有说清楚.