题目描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设 maxn 是单词中出现次数最多的字母的出现次数,minn 是单词中出现次数最少的字母的出现次数,如果 maxn−minn 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。
输入格式
一个单词,其中只可能出现小写字母,并且长度小于 100。
输出格式
共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word
,否则输出 No Answer
;
第二行是一个整数,如果输入单词是 Lucky Word
,输出 maxn−minn 的值,否则输出 0。
这到题上来可以说是没太有思路,想用另一个数组来存储重复出现的字母,奈何写不出来,后来想到可以用循环直接赋值,然后遍历输入的字符串,再创建一个数组,用这个数组记录26个字母的编号,在遍历这个字符串的过程中,每遇到一个相同的字母,就令数组中的对应元素加一,然后再用for循环来找出最大值和最小值,最后在判断是否为质数就可以了
1.找到重复出现的字符是重点
2.找到最大值和最小值
3.判断是否为质数(可以用布尔变量创建一个函数)
代码解答
#include<iostream>
using namespace std;
string word;
string copyword;
char zimu[26];
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main()
{
cin >> word;
int maxn = 0;
int main = word.length();
for (int i = 0; i < word.length(); i++)
{
char c = word[i];
zimu[c - 'a']++;
}
for (int i = 0; i < 26; i++)
{
if (zimu[i] > maxn)
{
maxn = zimu[i];
}
if(zimu[i]<main&&zimu[i]>0)
{
main = zimu[i];
}
}
int diff = maxn - main;
if (isPrime(diff)) {
cout << "Lucky Word" << endl;
cout << diff << endl;
}
else {
cout << "No Answer" << endl;
cout << 0 << endl;
}
}
for (int i = 0; i < word.length(); i++)
{
char c = word[i];
zimu[c - 'a']++;
}
就这一小段代码可是困扰了我好久,可以整理一下
首先利用for循环遍历这个字符串,再定义一个单个的字符来接收字符串中的值
还有一个重要的点因为这道题题目中说了,只有小写字母才可以用这种方式,因为大写字母的ASCII码是小写字母加上32
因为a的ASCII码是97,所以在每次c接受到字符串的值的时候
比如c接受了一个字母b,b的ASCII码为98,则循环中的’c-a'就是1,则数组zimu[1]就是字母‘b'出现的次数
由此可以在zimu这个数组中记录字母出现的次数
再用一个简单的找最大值最小值的方法找出出现的字母的最大值和最小值
最后创建一个函数来判断是否为质数
质数:大于1的自然数,且只有1和它自己本身的两个因数