三种方法求质数:
一、原理:每个合数都可以被质数整除;
1.把每个求出的质数存放在数组str[]中,
2.合数i整除数组中的质数,
3.将数组最后的数传给x;
4.再让i除x直到除到i-1;
5.再把i放入数组中;
#include<stdio.h>
#include<math.h>
#define N 1000
void sushu(int str[N]);
int main()
{
int str[N]={'1'};//将str初始化都为1;
sushu(str);
return 0;
}
void sushu(int str[N])
{
int i=2,j=0,k=0,x=0,p=0,z=0;
int n;
printf("输入需要素数的范围\n");
scanf("%d",&n);
str[0]=2;
while(i<=n)
{
j=0;
p=1;
while(j<k)
{
if(i%str[j]==0)
{
p=0;
break;
}
j++;
}
x=str[j-1];
while(x<=i-1)
{
if(i%x==0)
{
p=0;
break;
}
x++;
}
if(p==0)
{
i++;
continue;
}
str[k]= i;
i++;
k++;//k获取素数数组的最大角标
}
while(z<k)
{
printf("%d ",str[z]);
z++;
}
}
优点:
质数放在 数组str中,可以被调用;
缺点:
只能算出0~1000以内的质数;
二、原理:从j=2开始递增依次判断是否有j可以被i整除
#include<stdio.h>
int main()
{
int i,j,k=0;
for(i=2;i<1000000000000000000000000000000000000000000000000000000000000000;i++)//64位
{
for(j=2;j*j<=i;j++)
if(i%j==0)
break;
if(j*j>i)
{
printf("%d ",i);
k++;
if(k%5==0)
printf("\n");
}
}
}
优点:
可以判断2~10(64次方)之间的质数;
缺点:
判断出的数值无法被调用:
三、原理:去除素数的倍数筛选质数,与原理一类似;
#include<stdio.h>
#include<math.h>
#define N 10000
void prime(int n);
int str[N];
int main()
{
int i,n;
printf("输入一个数判断是否是质数\n");
scanf("%d",&n);
prime(n);
for(i=2;i<=n;i++)
if(str[i])//判断值数;
printf("%d ",i);
return 0;
}
void prime(int n)
{
int i,j,m;
for(i=2;i<=n;i++)
str[i]=1;
str[0]=str[1]=0;
m=sqrt(n);
for(i=2;i<=m;i++)
{
if(str[i])
for(j=2*i;j<=n;j=j+i)//筛选素数的整数倍:
str[j]=0;
}
}
优点:
1.可以计算0~100000000(一亿);
2.可对一个数进行单独判断是否是质数并调用;
缺点:
1.数据利用率不高,不能直接大批量调用;