统计字符串每个字符出现频率

[复制链接]
发表于 2025-9-23 01:00:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

输入一个字符串,统计每个字符的出现频率,然后判定最大频率与最小频率的差值 cnt:
如果 cnt 是质数,则输出 "Lucky Word" 和 差值;
否则输出 "No Answer" 和 0。
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. bool valid(int n)//判断是否为质数
  4. {
  5.   if (n <= 1) return false;
  6.     if (n == 2) return true;
  7.     if (n % 2 == 0) return false;
  8.     int sqrtN = static_cast<int>(sqrt(n));
  9.     for (int i = 3; i <= sqrtN; i += 2) {
  10.         if (n % i == 0) return false;
  11.     }
  12.     return true;
  13. }
  14. int main()
  15. {
  16.   unordered_map<char,int> fre;
  17.   string str;
  18.   cin >> str;
  19.   for(char c : str)
  20.   {
  21.     // if (islower(c))
  22.     fre[c]++;
  23.   }
  24.   int maxx = INT_MIN; //初始化
  25.   int minn = INT_MAX;
  26.   for(auto & [ _ ,fret ] : fre)
  27.   {
  28.     if(fret > maxx)
  29.     maxx = max(fret,maxx);
  30.     if(fret <minn)
  31.     minn = min(fret,minn);
  32.   }
  33. //第二种写法
  34.    for(auto & pairr : fre)
  35.   {
  36.     if(pairr.second > maxx)
  37.     maxx = max(pairr.second , maxx);
  38.     if(pairr.second < minn)
  39.     minn = min(pairr.second , minn);
  40.   }
  41.   int cnt = maxx - minn;
  42.   
  43.   if(valid(cnt))
  44.   {
  45.     cout << "Lucky Word"<<endl;
  46.     cout << cnt << endl;
  47.   }
  48.   else
  49.   {
  50.     cout << "No Answer"<<endl;
  51.     cout << 0 << endl;
  52.   }
  53.   return 0;
  54. }
复制代码
  1. bool valid(int n){
  2.   if(n < 2){
  3.     return false;  // 小于2的数不是质数
  4.   } else {
  5.     for(int i = 2; i * i <= n; i++){
  6.       if(n % i == 0){
  7.         return false;  // 有其他因数,不是质数
  8.       }
  9.     }
  10.   }
  11.   return true;  // 没有找到因数,是质数
  12. }
复制代码
 
  1. bool valid(int n)//判断是否为质数
  2. {
  3.   if (n <= 1) return false;
  4.     if (n == 2) return true;
  5.     if (n % 2 == 0) return false;
  6.     int sqrtN = static_cast<int>(sqrt(n));
  7.     for (int i = 3; i <= sqrtN; i += 2) {
  8.         if (n % i == 0) return false;
  9.     }
  10.     return true;
  11. }
复制代码
质数
质数(英文名:Prime number)又称素数,是指在大于1的天然数中,除了1和它自己以外不再有其他因数的天然数。
质数又称素数。 一个大于1的天然数,除了1和它自身外,不能被其他天然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
  1. int sqrtN = (int)sqrt(n);  // C 风格
  2. int sqrtN = static_cast<int>(sqrt(n));  // C++ 风格(更推荐)
复制代码
static_cast<int>(sqrt(n))是C++ 的 显式范例转换(范例安全)
  1. int sqrtN = static_cast<int>(sqrt(n));
  2. for (int i = 3; i <= sqrtN; i += 2) {
  3.     if (n % i == 0) return false;
  4. }
复制代码
原理:

如果一个数 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
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表