Hello大家好我是小亦今天呢也是又来更新题解了好吧,那么今天呢我们来重点讲一下来自NOIP2008年提高组的题目P1125(来自于洛谷网站),话不多说给思路qwq:
首先呢这道题呢是要求素数判断,质数,筛法,看起来其实挺简单的,但是我做的有点....不废话了一下是我个人思路,如果有误请指出Thanks♪(・ω・)ノ
这道问题的主要描述
给定一个单词,我们需要判断它是否是“Lucky Word”。根据题目描述,如果单词中出现次数最多的字母和出现次数最少的字母之间的差值是一个质数,则该单词是“Lucky Word”。
下面我来步骤分析qwq:
统计字母出现次数:
我们需要遍历单词,统计每个字母出现的次数。由于单词只包含小写字母,我们可以使用一个大小为26的数组来存储每个字母的出现次数。
找到最大和最小出现次数:
在统计过程中,我们同时需要跟踪出现次数的最大值(maxn)和最小值(minn)。需要注意的是,如果某个字母没有出现,则它的出现次数为0。
计算差值:
计算 maxn 和 minn 之间的差值。
判断质数:
判断步骤3中得到的差值是否是一个质数。质数定义为大于1的自然数,且除了1和它本身以外不再有其他因数。
输出结果:
如果差值是质数,输出“Lucky Word”和差值。
如果差值不是质数,输出“No Answer”和0。
注意事项
质数判断:质数的判断是这个问题的关键点之一。我们需要一个辅助函数来检查一个数是否是质数。
最小次数初始化:在初始化minn时,我们应该将其设置为一个比任何可能出现的maxn都小的值,但考虑到字母出现次数至少为0,我们可以将minn初始化为0。
处理相同次数:如果所有字母出现次数相同,则maxn和minn相等,此时差值为0,不是质数。
实现逻辑
初始化:创建一个长度为26的数组来统计每个字母的出现次数,并将maxn初始化为0,将minn初始化为一个较大的值(比如单词长度+1,因为出现次数不会超过单词长度)。
遍历单词:遍历单词中的每个字母,更新计数数组,并调整maxn和minn。
计算差值:用maxn减去minn。
质数检查:实现一个函数,通过遍历从2到sqrt(num)的所有整数,检查是否有任何数能整除目标数,从而判断一个数是否是质数。
输出:根据质数检查的结果,输出相应的字符串和差值或0。
嗯,思路给完了赶紧给代码(不过在此之前我要告诉大家,抄袭代码可耻请理性看待!)
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
// 函数:判断一个数是否是质数
bool isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
int main() {
string word;
cin >> word;
vector<int> count(26, 0); // 初始化26个字母的计数器为0
int maxn = 0, minn = 100;
// 计算每个字母的出现次数
for (char c : word) {
count[c - 'a']++;
}
// 找到出现次数最多和最少的字母的次数
for (int i = 0; i < 26; i++) {
if (count[i] > 0) {
if (count[i] > maxn) maxn = count[i];
if (count[i] < minn) minn = count[i];
}
}
// 计算 maxn - minn
int diff = maxn - minn;
// 判断是否为质数
if (diff > 1 && isPrime(diff)) {
cout << "Lucky Word" << endl;
cout << diff << endl;
} else {
cout << "No Answer" << endl;
cout << 0 << endl;
}
return 0;
}