数论-素数

Posted ac-ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论-素数相关的知识,希望对你有一定的参考价值。

一:三种基本的素数判定

1:穷举法:适用于数据较小的时候。时间复杂度:O(技术分享图片

int isPrime(int n)
{
    if(n==1||n==0)
        return 0;
    int m = sqrt(n+0.5);
    for(int i = 2; i <= m; i++)
        if(n%i==0)
            return 0;
    return 1;
}

2:埃拉托瑟尼筛法求素数     时间复杂度:O(技术分享图片)

#include<cmath> 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6;
int book[maxn];
int prime[maxn];
int main(void)
{
    int n;
    int num;
    while(~scanf("%d",&n))
    {
        num = 0;
        for(int i = 2; i <= n; i++)
        {
            if(book[i]==0)
                prime[num++] = i;
            for(int j = i * i; j <= n; j += i)
            {
                book[j] = 1;
            }
        }
        
        for(int i = 0; i < num; i++)
            cout<<prime[i]<<endl;
    }
    return 0;
}

3:欧拉筛法

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; 
const int maxn = 1e6;
int prime[maxn];
int book[maxn]; 
int main(void)
{
    int n;
    int num;
    while (~scanf("%d", &n))
    {
        num = 0;
        for (int i = 2; i <= n; i++)
        {
            if (book[i]==0)
                prime[num++] = i;
            for (int j = 0; j < num; j++)
            {
                if (i*prime[j] > n)
                    break; // 过大的时候跳出
                book[i*prime[j]] = 1;
                if ((i%prime[j]) == 0) // 如果i是一个合数,而且i % prime[j] == 0
                    break; 
            }
        }
        for (int i = 0; i < num; i++)
            printf("%d
", prime[i]);
    }
    return 0;
}

 

以上是关于数论-素数的主要内容,如果未能解决你的问题,请参考以下文章

数论--素数

三 数论的编程实验

数论——HDU - 2136

数论1.素数判断

数论_筛法求素数

算法15---数论6---素数,回文素数 分解质因素