zoukankan      html  css  js  c++  java
  • 有关素数的基础算法

    模板

     1 //假设输入都是正整数
     2 //素数测试O(√n)
     3 bool Is_prime(int n)
     4 {
     5     for (int i = 2; i * i <= n; i++)
     6         if (n % i == 0)  return false;
     7     return n != 1;            //1是例外,1不是素数
     8 }  
     9 
    10 //约数枚举O(√n)
    11 vector<int> divisor(int n)
    12 {
    13     vector<int>  res;
    14     for (int i = 1; i * i <= n; i++)
    15     {
    16         if (n % i == 0)
    17         {
    18             res.push_back(i);
    19             if (i != n / i)  res.push_back(n / i);
    20         }
    21     }
    22     return res;
    23 }
    24 
    25 //整数分解O(√n)
    26 map<int, int>prime_factor(int n)
    27 {
    28     map<int, int>res;
    29     for (int i = 2; i * i<= n; i++)
    30     {
    31         while (n % i == 0)
    32         {
    33             ++res[i];
    34             n /= i;
    35         }
    36     }
    37     if (n != 1)  res[n] = 1;        //最多只有一个素因数大于√n
    38     return res;
    39 }
    40 
    41 
    42 //返回n以内素数的个数
    43 //埃氏筛法O(nloglogn)
    44 const int maxn = 100000 + 10;
    45 int prime[maxn];            //prime[i]表示第i个素数
    46 bool is_prime[maxn + 1];    //is_prime[i]为true表示i是素数
    47 
    48 int sieve(int n)
    49 {
    50     int cnt = 0;
    51     for (int i = 0; i <= n; i++)  is_prime[i] = true;
    52     is_prime[0] = is_prime[1] = false;
    53     for (int i = 2; i <= n; i++)
    54     {
    55         if (is_prime[i])
    56         {
    57             prime[cnt++] = i;
    58             for (int j = i * i; j <= n; j += i)  is_prime[j] = false;  //i * i可能爆int
    59         }
    60     }
    61     return cnt;
    62 }
    63 
    64 //只要求得到素数表
    65 //埃氏筛法的简单改进
    66 const int maxn = 100000 + 10;
    67 bool is_prime[maxn + 1];   
    68 
    69 void sieve(int n)
    70 {
    71     int m = (int)sqrt(n + 0.5);
    72     memset(is_prime, true, sizeof(is_prime));
    73     is_prime[0] = is_prime[1] = false;                //1是特例
    74     for (int i = 2; i <= m; i++)  if (is_prime[i])
    75         for (int j = i * i; j <= n; j += i)  is_prime[j] = false;
    76 }
  • 相关阅读:
    React的状态管理工具
    Ant Design
    Mac 10.12安装专业抓包工具Wireshark
    Mac 10.12安装飞鸽传书IPMessager
    Mac 10.12安装XMind
    Mac 10.12安装SVN工具SmartSVM 7.6
    Mac 10.12安装Windows远程桌面工具Microsoft Remote Desktop
    Mac 10.12安装Office 2011
    Mac 10.12安装迅雷2.7.2
    Mac 10.12安装虚拟机软件VMware Fusion 12
  • 原文地址:https://www.cnblogs.com/lfri/p/9613649.html
Copyright © 2011-2022 走看看