求素数的几种方法

解题中,往往生成素数表,比对素数,求解快。

1.最经典的就是根据定义:如果一个正整数只有两个因子, 1和p,则称p为素数。

代码如下:

include<stdio.h>
#include<math.h>
bool is_primer(int x) {
        if(x<2)
                return false;
	if(x==2) 
		return true;
	for(int i=2;i<=sqrt(x);i++)
		if(x%i==0) 
			return false;
	return true;
}

时间复杂度:O(n);

2.改进, 偶数都可以被2整除,去掉所有偶数

代码如下


bool isPrime(int n) 
{     
	if(n < 2)
		return false;     
	if(n == 2)
		return true;     
	if(n%2 == 0)
		return false;      
	for(int i = 3; i < n; i += 2)         
		if(n % i == 0)
			return false;     
	return true; 
}

时间复杂度:O(n/2);提高了一倍


3. 进一步减少判断的范围

定理: 如果n不是素数, 则n有满足1证明: 如果n不是素数, 则由定义n有一个因子d满足1如果d大于sqrt(n), 则n/d是满足1代码如下


bool isPrime(int n)
{
    if(n < 2)
		return false;
    if(n == 2) 
		return true;
    if(n%2 == 0) 
		return false;
    int foo = (int)sqrt(n);
    for(int i = 3; i <= foo; i += 2)
        if(n%i == 0) 
			return false;
    return true;
}

时间复杂度O(sqrt(n)/2)


筛选法求素数

介绍:对于素数筛选法,具体方法就不阐述了,简单地说就是找到一个素数就把它的倍数标记为非素数。

include<stdio.h>
#include<string.h>
#define N 1000
int prime[N];
bool isprime[N];
void get_prime(int n) {
	memset(isprime, true, sizeof(isprime));
	int num=0;
	prime[num++]=2;
	for(int i=3;i<=n;i+=2)
		if(isprime[i]) {
			prime[num++]=i;
			for(int j=i+i;j<=n;j+=i)
				isprime[j]=false;
			/*代码优化:
			for(int j=i*i;j<=n;j+=i*2)*/
		}
	for(int k=0;k<num;k++)
		printf("%d\n", prime[k]);
}
 
int main() {
	int n=100;
	get_prime(n);
	return n;
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页