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]++,它们是同在一个循环中进行的。。。
    
    
    
    判断是否为质数时,构造了素数函数,全面考虑值的情况才能做到万无一失。。。
    其他的就同第一个解法相同了。。。


    • 0
      点赞
    • 2
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值