标签:线性筛 w3g pmf zju wak gps aos row rri
线性筛数一般用于筛选素数,有时也可以用于求因数个数和因数和等,但是由于我太蒟了,所以不会,所以这里暂时不列出来。
筛选素数的方法有很多种,第一种是暴力求解法:
对于一个要判断是否是素数的数n,我们通过传统说明“n是素数,表示这个n不被n以内的任何数整除(除了1)”来求,把i=2~n全部枚举一遍,也就是:
#include<stdio.h>
int main()
{
int i,n;
while(scanf("%d",&n)==1)
{ for(i=2;i<n;i++)
if(n%i==0) break;
if(i==n) printf("YES\n");
else printf("NO\n");
}
}
第二种方法,也就是比较常见的枚举+优化方法,因为n的质因数中必定有一个是≤√n所以
#include<stdio.h>
#include<math.h>
int main()
{ int i,n,x;
while(scanf("%d",&n)==1)
{ x=(int)sqrt(n);
for(i=2;i<=x;i++)
if(n%i==0) break;
if(i>x) printf("YES\n");
else printf("NO\n");
}
}
but!!!
这种方法的速度虽然会快一点,但是还没有到我们想象中的那样,所以还有什么优化的方法呢?
这时候我们就需要讲一个小故事了...
埃拉托斯特尼是一个古希腊数学家(古罗马?不知道,反正是个数学家了...),有一天,他非常无聊(所以发明了一个叫做线性筛数的东西)
他就在沙地上用棍子画了一个表格,长成这样:
标签:线性筛 w3g pmf zju wak gps aos row rri
原文地址:https://www.cnblogs.com/Wolfbeyond/p/9465389.html