标签:线性筛 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