笨小熊

笨小熊

时间限制: 2000 ms  |  内存限制: 65535 KB
难度: 2
描述

笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 
这种方法的具体描述如下:假设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
来源
NOIP2008
上传者

hzyqazasdf


问题分析:

输入:一行不包含空格的字符串

处理:求字符串中字母出现次数最多的次数、最少的次数,判断差值是否为素数。

输出:按题目要求进行输出。

关键点事建立字符到出现次数的映射关系,自然想到了map。但这里由于是字符到int型的映射,所以也可以利用字符的ASSIC2码值进行映射。

代码:

#include <iostream>
#include <stdio.h> 
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <algorithm>
#include <limits.h>
#define MAX 100
using namespace std; 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

bool isPrime(int x){
	bool ans=true;
	//因为x小于100 ,所以直接暴力求是否为素数 (字符串长度小于100) 
	//int geometric=sqrt(x)+1;
	if(x < 2){
		ans = false;
		return ans;
	}
	for(int i=2;i*i<=x;i++){
		if(x % i == 0){
			ans=false;
			break;
		}
	}
	return ans;
}
int main(int argc, char** argv) {
	int n;
	scanf("%d",&n);
	while(n--){	
	map<char,int> m; 
	//map初始化  26个字母全部初始化 
	for(int i=0;i<26;i++) {
		m['a'+i]=0;
	}
		//1.输入一行
		char  input[MAX];	 
		scanf("%s",input);
		
		//2.统计每个字母的出现次数 求max和min  方法:map映射 
		int length=strlen(input);
		for(int i=0;i<length;i++){
			m[input[i]]++;
		}
		//3.求max-min 
		int max=0,min=110;
		for(int i=0;i<26;i++){
			if(m['a'+i] == 0){  //为0说明这个字母没出现  直接跳过 
				continue;
			}
			if(m['a'+i]>max){
				max=m['a'+i];
			}
			if(m['a'+i]<min){
				min=m['a'+i];
			}
		}
			//cout<<max<<"  "<<min;
		//4.输出结果 
		if(isPrime(max-min) == true) {
			printf("Lucky Word\n%d\n",max-min); 
		}else{
			printf("No Answer\n0\n");
		}
	}
	return 0;
}
代码分析:

这里

int max=0,min=110;
for(int i=0;i<26;i++){
刚开始max,min都设为m[0],所以把i=0设为i=1了。后来发现m[0]可能是0,即这个字母没出现过。因此又换了max,min。但忘了把i=1换成i=0.导致浪费了大量的时间。
一开始怀疑判断素数写错了,然后怀疑输出格式有问题,然后怀疑map和字符数组初始化有问题(一开始用的全局变量)。最后开始怀疑map是不是不能用,简直怀疑人生。

收获:

1.尽量不要用全局变量。用全局变量再加上循环使用,很容易让上一次循环的值对下一次循环产生影响。反正是值的改变不可控。尽量使用局部的,哪里使用哪里声明。

2.c语言的最大、最小常量为INT_MAX、INT_MIN。封装在#include <limits.h>库里。不加库名有的编译器可能可以,但有的就不行,所以最好加上。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值