这个是经典的Eraosthenes筛法:
1 for (int i = 2; i * i < N; i++) 2 { 3 if (tag[i]) continue; 4 for (int j = i; j * j < N; j++) 5 tag[i*j] = 1; 6 } 7 for (int i = 2; i < N; i++) 8 if (!tag[i]) 9 prime[tol++] = i;
但是Eraosthenes筛法的速度并不快,原因在于对于一个合数,这种方法会重复的标记。一种线性筛素数的方法有效的解决了这一点,代码如下:
1 void get_prime() 2 { 3 int cnt = 0; 4 for (int i = 2; i < N; i++) 5 { 6 if (!tag[i]) p[cnt++] = i; 7 for (int j = 0; j < cnt && p[j] * i < N; j++) 8 { 9 tag[i*p[j]] = 1; 10 if (i % p[j] == 0) 11 break; 12 } 13 } 14 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步