Eratosthense筛法
介绍一下Eratosthense筛法(这里是素数表的打法)
对于不超过n的每个非负数P删除2*p,3*p.....,当处理完所有的剩下的就是素数了,
优化方案之一是判重,二是开平方和平方。
首先解释为什么要平方,因为假设i是大于2的,那么i之前的2i,3i,4i什么的都已经被2倍3倍的筛掉了,所以要平方,
再来解释为什么开方就简单了,都i*i做起始了,不开方后边的也是浪费。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<stdio.h> #include<math.h> #include<string.h> #define INF 1000000 int vis[1234567]; int main() { memset(vis,0, sizeof (vis)); int h=sqrt(INF+0.5); for ( int i=2;i<=h;i++){ if (!vis[i]){ for ( int j=i*i;j<=INF;j+=i) vis[j]=1; } } int n,m; while (~scanf( "%d%d" ,&n,&m)){ int step=0; for ( int i=n;i<=m;i++) if (!vis[i]) step++; printf( "%d\n" ,step); } } |
我觉得这是一种思想可以用在其他的优化上,引用空间来缩短时间,还有就是开平方和平方的处理 。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步