判断素数的 5 种方法
方法 1
从 2 到 x-1 是否可以整除。能:不是素数;不能:是素数。特别的,1 不是素数
/**
输入:x:需要判断的数
输出:0:不是素数;1:是素数
**/
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
去掉偶数后,从 3 到 x-1,每次加 2(2 除外)
/**
输入:x:需要判断的数
输出:0:不是素数;1:是素数
**/
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;
}
优点:能减少一半的循环时间
方法 3
无需到 x-1,到 sqrt()就行了
/**
输入:x:需要判断的数
输出:0:不是素数;1:是素数
需要头文件:#include"math.h"
**/
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;
}
方法 4
判断是否能被已知并且小于 x 的素数整除
#include"stdio.h"
int isprisme(int x,int knowprime[],int length); //函数声明
void main()
{
int number=100; //定义素数的个数
int prime[100]={2};
int count=1; //记录当前素数的个数
int i=3; //循环的自然数
while(count<number)
{
if(isprisme(i,prime,count)) //判断是否为素数
{
prime[count]=i;
count++;
}
i++;
}
for(i=0;i<number;i++) //打印100个素数,10个一排
{
printf("%d\t",prime[i]);
if((i+1)%10==0)
printf("\n");
}
}
/*
输入:x;需要判断的数;knowprime[]:素数表;length:当前素数的个数
输出:1:是素数;0:不是素数
*/
int isprisme(int x,int knowprime[],int length)
{
int ret=1;
int i;
for(i=0;i<length;i++)
{
if(x%knowprime[i]==0)
{
ret=0;
break;
}
}
return ret;
}
结果:
方法 5
方法 5:构造素数表
- 令 x=2;
- 将 2x,3x,4x…ax<n 的数标记为非素数
- 令 x 为下一个没有被标记的非素数的数,重复 2;直到所有数都已经尝试完毕
具体化
目标:欲构造 n 以内(不含 n)的素数表
- 开辟 prime[n],初始化所有元素都为 1,prime[x]=1:表示 x 是素数
- 令 x=2;
- 如果 x 是素数,则对于
(i=2;x*i<n;i++)令prime[i*x]=0
- 令 x++,如果 x<n,重复 3,否则结束
#include"stdio.h"
void main()
{
int maxnumber=100; //计算100以内的素数
int isprime[100]; //判断其下标是否为素数:1:是;0:不是
int i,x;
int number=0; //记录素数的个数
for(i=0;i<maxnumber;i++) //初始化 isprime[]
{
isprime[i]=1;
}
for(i=2;i<maxnumber;i++)
{
if(isprime[i])
{
for(x=2;x*i<maxnumber;x++) //素数的整数倍都等于0
isprime[x*i]=0;
number++; //打印:5个一排
printf("%d\t",i) ;
if(number%5==0)
printf("\n");
}
}
}
结果: