判断素数的多种方法【以C语言为例】

前言

判断素数虽然简单但方法众多,使用合适的方法不仅可以减少运行时间,还可以降低所占用的内存空间。

法一

int isprime(int x)
{
	int ret=1;
	int i;
	if(x==1)
		ret=0;
	for(i=2;i<x;i++){
		if(x%i==0)
		{
			ret=0;
			break;
		}
		
	}
	return ret;
}

最简单的一种方法,将被判断数从2开始依次除以比它本身小的数,如结果为0,则跳出循环,证明不是素数,反之,则证明是素数。对于n要循环n-1遍,当n很大时就是n遍,该法时间复杂度为O(n)。

法二

int isprime(int x)
{
	int ret=1;
	int i;
	
	if(x==1||
		(x%2==0&&x!=2))
		ret=0;
		
	for(i=3;i<x;i+=2){
		if(x%i==0)
		{
			ret=0;
			break;
		}
	}	
	return ret;
}

偶数可以被2整除,必定不是素数,故先排除除数中的偶数,其余步骤同法一。如果x为偶数,立刻得出结果,否则循环(n-3)/2 + 1 遍,当n很大时就是n/2遍,该法时间复杂度为O(n/2)。

法三

int isprime(int x)
{
	int ret=1;
	int i;
	
	if(x==1||
		(x%2==0&&x!=2))
		ret=0;
		
	for(i=3;i<sqrt(x);i+=2){
		if(x%i==0)
		{
			ret=0;
			break;
		}
	}	
	return ret;
}

将一个整数分解,观察它的两个因数,可以发现这两个因数以整数的方根为界限,如 16=2*8 ,16 的方根为4,其中 2<4,8>4 ,即取模只需取到它的方根即可,后面均是无效操作。其余步骤同法二。

法四

#include

int isprime(int x,int knownprimes[],int numberofknownprimes)
{
	int ret=1;
	int i;
	for(i=0;i<numberofknownprimes;i++){
		if(x%knownprimes[i]==0)
		{
			ret=0;
			break;
		}
	}
	return ret;
}

int main(void)
{
	const int number=100;
	int prime[number]={2};
	int i=3;
	int count=1;
	
	while(count<number){
		
		if(isprime(i,prime,count))
			prime[count++]=i;
			
		i++;	
	}
	
	for(i=0;i<number;i++){
		printf("%d",prime[i]);
		if((i+1)%5)
			printf("\t");
		else
			printf("\n");	
	}
	
	return 0;
}

通过判断是否能被已知的且小于x的素数整除来验证整数是否为素数,先构造一张素数表,将其储存在数组中。
欲构造n以内(不含)的素数表。
1.开辟prime[n],初始化其所有元素为1,prime[x]为1表示x是素数。
2.令x=2
3.如果x是素数,则对于(i=2;xix]=0。
4.令x++,如果x

你可能感兴趣的:(c语言,算法,开发语言)