1851:【08NOIP提高组】笨小猴

本文介绍了如何解决一道信息学奥赛题目,即判断一个单词是否为Lucky Word。Lucky Word是指单词中出现次数最多字母与最少字母的差值为质数的单词。文章详细解析了解题思路,包括输入字符串、统计字母出现次数、判断差值是否为质数等步骤,并给出了解题过程中的错误和修正方法。

题目链接:信息学奥赛一本通 1851:【08NOIP提高组】笨小猴http://ybt.ssoier.cn:8088/problem_show.php?pid=1851

题目内容

【题目描述】

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头痛。经实验证明,用这种方法去选择选项的时候选对的几率非常大!

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

【输入】

只有一行,是一个单词,其中只可能出现小写字母,且长度小于100。

【输出】

共两行,第一行是一个字符串,假如输入的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;

第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。

【输入样例】

error

【输出样例】

Lucky Word
2

【提示】

【输入输出样例1解释】

单词error中出现最多的字母r出现了3次,出现次数最少的字母出现1次,3-1=2,2是质数。

【输入输出样例2】

输入:

olymipic

输出:

No Answer

0

【输入输出样例2解释】

单词olymipic中出现最多的字母i出现了2次,出现次数最少的字母出现1次,2-1=1,1不是质数。

以下是题解

——————————————分割线——————————————————————————

 AC题解

#include <bits/stdc++.h>
using namespace std;
int main(){
	long long ans[26],min=1e9,max=-1e9; //min是求出现最少的字母时使用,max反之
	bool flag=0;
	for(int i=0;i<26;i++){
		ans[i]=0;
	}
	string a;
	cin>>a;
	for(int i=0;i<a.length();i++){
		if(a[i]-'a'<=26){
			ans[a[i]-'a']++;
		}else if(a[i]-'A'<=26){
			ans[a[i]-'A']++;
		}
	}
	for(int i=0;i<26;i++){
		if(ans[i]<=min&&ans[i]!=0){
			min=ans[i];
		}
	}
	for(int i=0;i<26;i++){
		if(ans[i]>=max&&ans[i]!=0){
			max=ans[i];
		}
	}
	if(max-min==1||max-min==0){
		cout<<"No Answer"<<endl<<"0";
		return 0; 
	}
	for(int i=2;i<sqrt(max-min);i++){
		if((max-min)%i==0){
			flag=1;
		}
	}
	if(flag==0){
		cout<<"Lucky Word"<<endl<<max-min;
	}else{
		cout<<"No Answer"<<endl<<"0";
		return 0;
	}
	return 0;
}

解题思路

一.任务分解

尝试分解任务要点为:

        1.输入一个字符串

        2.统计字符串中出现最多的字母的数量和出现最少的字母的数量

        3.判断两数的差是否是质数

                如果是质数,输出 "Lucky Word" ,然后换行输出两数的差。

                如果是合数,输出"No Answer",然后换行输出0。

        需要特别注意的是,如果两数差是1或者是0,则不认为这是一个Lucky Word 。

  二.实现尝试

        我首先尝试编写了如下代码:(以下代码不是满分代码!

        

#include <bits/stdc++.h>
using namespace std;
int main(){
	long long ans[26],min=1e9,max=-1e9;
	for(int i=0;i<26;i++){
		ans[i]=0;
	}
	string a;
	cin>>a;
	for(int i=0;i<a.length();i++){
		if(a[i]-'a'<=26){
			ans[a[i]-'a']++;
		}else if(a[i]-'A'<=26){
			ans[a[i]-'A']++;
		}
	}
	for(int i=0;i<26;i++){
		if(ans[i]<=min&&ans[i]!=0){
			min=ans[i];
		}
	}
	for(int i=0;i<26;i++){
		if(ans[i]>=max&&ans[i]!=0){
			max=ans[i];
		}
	}
	for(int i=2;i<=sqrt(max-min);i++){
		if((max-min)%i==0){
			cout<<"No Answer";
			return 0;
		}
	}
	cout<<"Lucky Word"<<endl<<max-min;
	return 0;
}

        结果发现只过了5个测试点,剩下五个点WA掉了。看了一下,发现有以下几个问题:

        1.输出“No Answer”的时候,还需要换行输出0!

        2.没有实现如果两数差是1或者是0,则不认为这是一个Lucky Word的操作 。

        3.原代码中以下部分:

if((max-min)%i==0){
			cout<<"No Answer";
			return 0;
		}

        应该修改为布尔型变量flag判断的形式。

        于是修改,大功告成!

附:测试点说明

以下测试点是由作者在信息学奥赛一本通测试平台上进行黑箱测试后得到的结果,可以进行参考

测试点序号测试点特征
1不是Lucky Word,Minn和Maxn的差值不为零
2不是Lucky Word,Minn和Maxn的差值不为零
3是Lucky Word,Minn和Maxn的差值不为零
4是Lucky Word,Minn和Maxn的差值不为零
5是Lucky Word,Minn和Maxn的差值不为零
6不是Lucky Word,Minn和Maxn的差值为零
7不是Lucky Word,Minn和Maxn的差值不为零
8不是Lucky Word,Minn和Maxn的差值不为零
9是Lucky Word,Minn和Maxn的差值不为零
10是Lucky Word,Minn和Maxn的差值不为零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值