【C++】素数求解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41035588/article/details/82875067

辗转相除法

辗转相除法代码【求出1000000以内的素数并且输出n个素数】

#include<iostream>
#include<cmath>
using namespace std;

#define LENGTH 1000000
int main()
{
	for(int i= 2; i<LENGTH; ++i)
	{
		for(int j = 2; j<sqrt(i); ++i)
		{
			if(i %j == 0)
			{
				break}	
		}
		if(j>sqrt(i))
		{
			printf("素数为:%d ",i);
		}

	}
	return 0;
}

筛选法

  • 埃氏筛法

【埃氏筛法原理】

素数的定义:素数就是除了1和本身之外没有其他的约数,所以有约数的都不是素数。
因此,埃氏筛法的思想就是:先去掉2的倍数,再去掉3的倍数,再去掉4的倍数,……依此类推,直到最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数。
埃氏筛法时间复杂度O(nloglogn)

埃氏筛法代码【求出1000000以内的素数并且输出n个素数】

#include<iostream>
#include<cstring>
using namespace std;
#define LENGTH 1000000
int is_prime[LENGTH];
int prime[LENGTH];
int main(){
    int n,p=1,i; 
    memset(is_prime,0,sizeof(int)*LENGTH);
    is_prime[2]=0;
    for(i=2;i<=1000;i++){
        if(is_prime[i]==0){
            prime[p++]=i;
            for(int j=2*i;j<=1000000;j+=i)
                is_prime[j]=1;
            }
    }
    for(;i<=1000000;i++)
        if(is_prime[i]==0)
            prime[p++]=i;
    while(cin>>n){
        for(int i=1;i<=n;i++)
        cout<<prime[i]<<endl;
    }
    return 0;
} 
  • 欧拉筛法

【欧拉筛法原理】

欧拉筛法的原理同埃氏筛法,只不过多了一个判断删除的过程。
首先,任何合数都能表示成多个素数的积。所以,任何的合数肯定有一个最小质因子。我们通过这个最小质因子就可以判断什么时候不用继续筛下去了。
当i是prime[j]的整数倍时(i % prime[j] == 0),iprime[j+1]肯定被筛过,跳出循环。
因为i可以看做prime[j]某个数, i
prime[j+1]就可以看做 prime[j]某个数prime[j+1] 。而 prime[j] 必定小于 prime[j+1],
所以 i
prime[j+1] 必定已经被 prime[j]*某个数 筛掉,就不用再做了
欧拉筛法时间复杂度O(n)

埃欧拉筛法代码【求出1000000以内的素数并且输出n个素数】

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

#define LENGTH 700001
int is_prime[LENGTH];//是否是素数 
int prime[LENGTH];//素数表 
int pri[LENGTH];//欧拉函数表 
int main() {
    int a, b;
    memset(is_prime, 0, sizeof(int)*LENGTH);
    memset(prime, 0, sizeof(int)*LENGTH);
    memset(pri, 0, sizeof(int)*LENGTH);
    for (int i = 2, t = 0, p = 0; i <= LENGTH; i++) {
        pri[i] = pri[i - 1];
        if (is_prime[i] == 0)
        {
            prime[p++] = i;
            pri[i]++;
        }
        for (int j = 0; j<p&&i*prime[j] <= LENGTH; j++) {
            is_prime[i*prime[j]] = 1;
            if (i%prime[j] == 0)
                break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41035588/article/details/82875067
今日推荐