有关素数的基础算法

模板

 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;
59         }
60     }
61     return cnt;
62 }
63 
64 //只要求得到素数表
65 //埃氏筛法的简单改进
66 //const int maxn = 100000 + 10;
67 //bool vis[maxn];   //vis[i]为false表示i为素数
68 
69 void sieve_11(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 }

猜你喜欢

转载自www.cnblogs.com/lfri/p/9613649.html
今日推荐