马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
输入一个字符串,统计每个字符的出现频率,然后判定最大频率与最小频率的差值 cnt:
如果 cnt 是质数,则输出 "Lucky Word" 和 差值;
否则输出 "No Answer" 和 0。
- #include <bits/stdc++.h>
- using namespace std;
- bool valid(int n)//判断是否为质数
- {
- if (n <= 1) return false;
- if (n == 2) return true;
- if (n % 2 == 0) return false;
- int sqrtN = static_cast<int>(sqrt(n));
- for (int i = 3; i <= sqrtN; i += 2) {
- if (n % i == 0) return false;
- }
- return true;
- }
- int main()
- {
- unordered_map<char,int> fre;
- string str;
- cin >> str;
- for(char c : str)
- {
- // if (islower(c))
- fre[c]++;
- }
- int maxx = INT_MIN; //初始化
- int minn = INT_MAX;
- for(auto & [ _ ,fret ] : fre)
- {
- if(fret > maxx)
- maxx = max(fret,maxx);
- if(fret <minn)
- minn = min(fret,minn);
- }
- //第二种写法
- for(auto & pairr : fre)
- {
- if(pairr.second > maxx)
- maxx = max(pairr.second , maxx);
- if(pairr.second < minn)
- minn = min(pairr.second , minn);
- }
- int cnt = maxx - minn;
-
- if(valid(cnt))
- {
- cout << "Lucky Word"<<endl;
- cout << cnt << endl;
- }
- else
- {
- cout << "No Answer"<<endl;
- cout << 0 << endl;
- }
- return 0;
- }
复制代码- bool valid(int n){
- if(n < 2){
- return false; // 小于2的数不是质数
- } else {
- for(int i = 2; i * i <= n; i++){
- if(n % i == 0){
- return false; // 有其他因数,不是质数
- }
- }
- }
- return true; // 没有找到因数,是质数
- }
复制代码 - bool valid(int n)//判断是否为质数
- {
- if (n <= 1) return false;
- if (n == 2) return true;
- if (n % 2 == 0) return false;
- int sqrtN = static_cast<int>(sqrt(n));
- for (int i = 3; i <= sqrtN; i += 2) {
- if (n % i == 0) return false;
- }
- return true;
- }
复制代码 质数
质数(英文名:Prime number)又称素数,是指在大于1的天然数中,除了1和它自己以外不再有其他因数的天然数。
质数又称素数。 一个大于1的天然数,除了1和它自身外,不能被其他天然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
- int sqrtN = (int)sqrt(n); // C 风格
- int sqrtN = static_cast<int>(sqrt(n)); // C++ 风格(更推荐)
复制代码 static_cast<int>(sqrt(n))是C++ 的 显式范例转换(范例安全)
- int sqrtN = static_cast<int>(sqrt(n));
- for (int i = 3; i <= sqrtN; i += 2) {
- if (n % i == 0) return false;
- }
复制代码 原理:
如果一个数 n 可以被某个数 i 整除(i * j == n),那肯定有一对因数 (i, j)。
- 如果 i > sqrt(n),那么对应的 j 肯定是 < sqrt(n)
- 以是检查到 sqrt(n) 就能覆盖全部大概的因数对,凌驾了就重复了。
举个例子:
判定 n = 49 是否为质数:
- 它的因数对是 (1,49) 和 (7,7)
- 凌驾 sqrt(49)=7 再查着实没意义了
为什么只查奇数:i += 2?
- 由于偶数除了 2 自己,不大概是质数
- 以是我们在函数开头已经判定了 if (n % 2 == 0) return false;,后面只查奇数更快!
527
|