zoukankan      html  css  js  c++  java
  • 快速筛法求素数

    http://blog.csdn.net/stack_queue/article/details/53560887

    筛法的思想是去除要求范围内所有的合数,剩下的就是素数了,而任何合数都可以表示为素数的乘积,因此如果已知一个数为素数,则它的倍数都为合数。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MAX 100000
     4 long long su[MAX], cnt;
     5 bool isprime[MAX];
     6 
     7 void prime()
     8 {
     9     cnt = 1;
    10     memset(isprime, 1, sizeof(isprime));
    11     isprime[0] = isprime[1] = 0;
    12     for(long long i = 2; i <= MAX; i++)
    13     {
    14         if(isprime[i])
    15         {
    16             su[cnt++] = i;
    17         }
    18         for(long long j = i * 2; j <= MAX; j += i)
    19         {
    20             isprime[j] = 0;
    21         }
    22     }
    23 }
    24 
    25 
    26 int main()
    27 {
    28     prime();
    29     for(long long i = 1; i < cnt; i++)
    30         cout << su[i] << " ";
    31     return 0;
    32 }

    如果只筛选小于等于素数i的素数与i的乘积,既不会造成重复筛选,又不会遗漏。时间复杂度几乎是线性的。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MAX 100000
     4 bool isprime[MAX];
     5 long long su[MAX], cnt;
     6 
     7 void prime()
     8 {
     9     cnt = 1;
    10     memset(isprime, 1, sizeof(isprime));//初始化认为所有数均为素数
    11     isprime[0] = isprime[1] = 0;
    12     for(long long i = 2; i <= MAX; i++)
    13     {
    14         if(isprime[i])
    15             su[cnt++] = i;
    16         for(long long j = 1; j < cnt && su[j] * i < MAX; j++)
    17         {
    18             isprime[su[j] * i] = 0;//筛掉小于等于i的素数和i的积构成的合数
    19         }
    20     }
    21 }
    22 
    23 int main()
    24 {
    25     prime();
    26     for(long long i = 1; i < cnt; i++)
    27         cout << su[i] << " ";
    28     return 0;
    29 }
  • 相关阅读:
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    面向对象
    3.1
    面向对象
  • 原文地址:https://www.cnblogs.com/CZT-TS/p/8401012.html
Copyright © 2011-2022 走看看