统计字符串每个字符出现频率
输入一个字符串,统计每个字符的出现频率,然后判断最大频率与最小频率的差值 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 <= 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