判断素数的方法
素数的定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除的素数叫素数。
方法一:
单独判读输入的数n是不是1和2,再从2到n-1判断是否存在能被2整除的数,如果有就是素数,没有就不是素数。核心代码如下:
#include<stdio.h>
func(int n)
{
if(n<=1)
return 0;
else if(n==2)
return 1;
else {
for(int i=2;i<n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
}
int main()
{
int n;
scanf("%d",&n);
if(func(n)) printf("是素数");
else printf("不是素数");
}
其中优化的一个方法就是对于一个正整数n,如果用二到根号n之间的整数去除,均无法整除,则为素数,否则就不是素数。
此方法就是将上面的for循环稍微改变一下,再加上#include<math.h>。
改变如下:
for(int i=2;i<sqrt(n);i++)
{
if(n%i==0)
return 0;
}
return 1;
}
方法二:筛选法
找一个范围内的所有的素数,从这个范围的第一个数起,将这个数的所有倍数都置0,再将下一个非0的数的倍数都置0。例如找2-200内的所有素数:
1.首先先定义一个数组a[],将2-200放入a[2]~a[200]中去。
2.第一个数是素数,将后面2的整数倍的数全部筛去,筛去的置0。
3找出下一个非0的数字a[i],它就是新的素数i。
4.筛去i的整数倍,置0。
5.若i小于200的平方根,则继续寻找下一个非0数。否则输出2~200之间的素数。
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n,a[201];
for(i=2;i<=200;i++)
a[i]=i; // 将数字放入数组
for(i=2;i<=sqrt(200);i++)
{
if(a[i]!=0)
{
for(j=i+i;j<=200;j+=i)
a[j]=0; //将i的倍数置0
}
}
for(i=2;i<200;i++)//输出
if(a[i])
printf("%5d",i);
}
方法三:6素数法
5以内只有1,2,3,5是素数,我们将在100以内的素数列出,发现它们都在6的倍数的左右。例:
(5,6,7),(11,12,13),(17,18,19)(23,24,**25**),(29,30,31),(**35**,36,37),(41,42,43),(47,48,49),
我们将会发下在6的倍数的左右两边除了5 的倍数以外的数为素数。
而在100以内大于5的数字内除去6的倍数的左右两边的数字后,剩下的数字为8,9,10,14,15,16,20,21,22,26,27,28.......以此类推,我们不难发现这些数字均为2或3的倍数。
综上所述,我们要筛去2,3,5的倍数,然后6左右的数便为素数。
代码如下:
#include<stdio.h>
#include<math.h>
int func(int x)
{
if(x<=1)
return 0;
if(x==2||x==3||x==5)
return 1;
if(x%2==0||x%3==0||x%5==0)
return 0;
for(int i=6;i<=sqrt(x);i+=6)
{
if(x%(i-1)==0||x%(i+1)==0)
return 0;
return 1;
}
}
int main()
{
int n;
scanf("%d",&n);
if(func(n)) printf("是");
else printf("不是");
return 0;
}
第一次写,如果有什么不对请大佬指出,谢谢。