整理了素数的判断筛选的一些方法,建议留出时间肝一下。
首先由简入难,思考一下如何判断一个数是不是素数?
最简单最暴力的方法就是定义法了,即根据素数的定义(除1以外的数,只能被1和它本身整除),通过循环,判断2到这个数之间有没有可以被这个数整除的数,有就不是素数,没有就是素数。
无优化:
理解简单代码也简单:
#include<stdio.h>
int ssf1(int n)//判断n是否为素数,是返回1,不是返回0
{
int j;
for(j=2;j<n;j++)
if(n%j==0)
return 0;
return 1;
}
int main()
{
int n;
scanf("%d",&n);
if(ssf1(n))
printf("YES\n");
else
printf("NO\n");
return 0;
}
优化1:
那么把这个简单暴力的方法优化一下,优化前首先要了解一个事情,就是对于任何一个正整数n,都可以写成√(n-x)*√(n-x)的形式,ok,我们在上面那个方法中判断n是否是素数时,是将2到n-1之间的整数每一个都要判断一遍,直到中途结束或最终结束,现在我们就只需要判断2到√n之间的整数就可以,为什么?首先为什么不判断√n以后的数了,因为因为如果2到√n之间有一个整数数能被n整除,n就不是素数,而如果2到√n之间没有一个整数能被n整除,那么√n之后的也不会被n整除,思考一下。
理解好了,代码也就出来了:
#include<stdio.h>
int ssf2(int n)//是素数返回1,不是返回0
{
int j;
for(j=2;j*j<=n;j++)
if(n%j==0)
return 0;
return 1;
}
int main()
{
int n;
scanf("%d",&n);
if(ssf2(n))
printf("YES\n");
else
printf("NO\n");
return 0;
}
优化2:
ok,这样已经好多了,但是还可以再优化优化,也是优化前先了解个事情,那就是除了2和3以外的素数,其他的素数一定位于6的倍数两侧,但位于6的倍数两侧的数不一定是素数。
需要看证明的看一下,不需要的就可以想一下如何优化代码了: 设 x>=1,可以把6个相连整数表示为6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x