素数
参考链接:https://cloud.tencent.com/developer/article/2054290
朴素素数:
bool rule(int n){ for(int i=2;i*i<=n;i++) if(n%i==0) return false; return true; }
埃氏筛法 :
从2开始,将每个质数的倍数都标记成合数(限制条件为倍数小于n),以达到筛选素数的目的。
const int N=1e8; int vis[N]; void prime(int n){ vis[0]=vis[1]=1; for(int i=2;i<=n;i++){ if(!vis[i]){ for(int j=i*i;j<=n;j+=i)//n是素数,所以n*n,n*(n+1)不是素数 vis[j]=1; } } }//当vis[i]==0的时候表示i为素数
埃氏筛法的缺陷 :对于一个合数,有可能被筛多次。例如 30 = 2 * 15 = 3 * 10 = 5*6……如何确保每个合数只被筛选一次,我们用它的最小质因子来筛选,便是欧拉筛法。
此刻引入欧拉筛
欧拉筛:
让每个合数只被它的最小质因子筛选一次,以达到不重复的目的
const int N=1e8; int vis[N],prime[N];//vis的素数标记数组,prime保存素数 void Prime(int n){ for(int i=2;i<=n;i++){ if(!vis[i]) prime[++prime[0]]=i;//prime[0]为素数个数 for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){//遍历已经保存素数中 vis[i*prime[j]]=1; if(i%prime[j]==0)break;//优化
//i = 8 ,j = 1,prime[j] = 2,如果不跳出循环,prime[j+1] = 3,8 * 3 = 2 * 4 * 3 = 2 * 12,在i = 12时会计算。因为欧拉筛法的原理便是通过最小素因子来消除。
} } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现