nyoj_笨小熊

笨小熊

这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小熊就认为这是个Lucky Word,这样的单词很可能就是正确的答案。

输入
第一行数据N(0<N<100)表示测试数据组数。
每组测试数据输入只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
输出
每组测试数据输出共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”; 
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0
样例输入
2
error
olympic
样例输出
Lucky Word
2
No Answer
0
刚开始看到这道题,我想到的是笨方法:
#include<stdio.h>
#include<string.h>
int main()
{
 int n; 
 scanf("%d",&n);
 while(n--){
 
       char a[100];
       int i,p,c,m,max,min,b[26];
       for(i=0;i<26;i++)
       b[i]=0;
       scanf("%s",a);
       m=strlen(a);
     for(i=0;i<m;i++){
      switch(a[i]){
        case 'a': b[0]++;break;
        case 'b': b[1]++;break;
        case 'c': b[2]++;break;
        case 'd': b[3]++;break;
        case 'e': b[4]++;break;
        case 'f': b[5]++;break;
        case 'g': b[6]++;break;
        case 'h': b[7]++;break;
        case 'i': b[8]++;break;
        case 'j': b[9]++;break;
        case 'k': b[10]++;break;
        case 'l': b[11]++;break;
        case 'm': b[12]++;break;
        case 'n': b[13]++;break;
        case 'o': b[14]++;break;
        case 'p': b[15]++;break;
        case 'q': b[16]++;break;
        case 'r': b[17]++;break;
        case 's': b[18]++;break;
        case 't': b[19]++;break;
        case 'u': b[20]++;break;
        case 'v': b[21]++;break;
        case 'w': b[22]++;break;
        case 'x': b[23]++;break;
        case 'y': b[24]++;break;
        case 'z': b[25]++;break;
   }
	 }
      max=b[0];
    for(i=0;i<26;i++){
      if(max<b[i])
       max=b[i];
	}
       min=1;
   for(i=0;i<26;i++){
      if(b[i]==0)
      continue;
     if(min>b[i])
       min=b[i];
   }
     c=max-min;
  for(i=2;i<c;i++){
     p=0;
    if(c%i==0){
      p=1;
      break;
    }
  }
       if(c==2||p==0)
       printf("Lucky Word\n%d\n",c);
       else
        printf("No Answer\n0\n");
 }
   return 0;
}
这种方法,利用多分枝选择语句switch();
『参考』
switch(表达式){ 
    case 常量表达式1:  语句1;
    case 常量表达式2:  语句2;
    … 
    case 常量表达式n:  语句n;
    default:  语句n+1;
}
其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以就会出现继续执行所有后面case语句的情况。为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。 
在使用switch语句时还应注意以下几点:
  1. 在case后的各常量表达式的值不能相同,否则会出现错误。
  2. 在case后,允许有多个语句,可以不用{}括起来。
  3. 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
  4. default子句可以省略不用。
然后就是求出来出现次数最大的和最小的,求其差。然后再判断其是否为质数,按照题意要求输出结果。
做出来这道题后,我再想是不是还有其他简单点的,,,
于是又一个答案出来了:
#include<stdio.h>
#include<string.h> 
int prime(int n){//用来判断p是否是质数//
    int i;
     if(n==0||n==1)
      return 0;
     if(n==2)
     return 1;
   for(i=2;i<n;i++){
    if(n%i==0)
    return 0;
   }
     return 1;
}
int main() 
{     
     int n;
     scanf("%d",&n);    
     getchar();
     while(n--)   {       
     char a[100]; //用来存放输入字符 //      
     int b[26]; //用来统计字母出现次数//      
     int i,j,m,max,min,p;
     gets(a);
     m=strlen(a);//获取输入字符数组的长度// 
    for(i=0;i<26;i++)            
      b[i] = 0;//数组初始化为零//
     for(i=0;i<m;i++)           
      b[a[i]-'a']++; 
        j=0;
      for(i=0;i<26;i++){// 统计字母出现次数j// 
        if(b[i]>0){
        b[j]=b[i];
        j++;
		}
	  }
     max = -1;
     min = 150;
     for(i=0;i<j;i++){//在b数组中找出现次数最大的和最小的//  
        if(b[i]>max)                     
        max=b[i];               
        if(b[i]<min)
        min=b[i];
  }
	    p=max-min;
        if(prime(p))
       printf("Lucky Word\n%d\n",p);
       else
        printf("No Answer\n0\n");
  
   }    
   return 0; 
}


思路改进:如果a[i]=='a',那么b[i]++,它们是同在一个循环中进行的。。。

判断是否为质数时,构造了素数函数,全面考虑值的情况才能做到万无一失。。。
其他的就同第一个解法相同了。。。


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页