首页 > 其他分享 >素数

素数

时间:2022-11-21 21:24:10浏览次数:32  
标签:prime 筛法 int 合数 vis 素数

参考链接: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时会计算。因为欧拉筛法的原理便是通过最小素因子来消除。
} } }

 

标签:prime,筛法,int,合数,vis,素数
From: https://www.cnblogs.com/jerrytangcaicai/p/16913277.html

相关文章

  • 素数筛
    title:素数筛date:2022-11-1612:41:47tags:算法本文章遵守知识共享协议CC-BY-NC-SA,转载时需要署名,推荐在我的个人博客阅读。大意素数筛是一种快速在$[1,n]$......
  • 素数筛法及其优化策略
    暴力算法寻找素数的效率是底下的,可以通过素数筛法来在一个自然数表中标记处素数。Eratosthenes筛法首先是Eratosthenes筛法,基本方法就是首先排除所有大于2的偶数,然后从3......
  • 数组~筛法求素数
    题目描述用筛法求之N内的素数。 用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列,1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后......
  • 计算机等级考试二级C语言程序设计专项训练题——素数及应用
        素数(primenumber)又称质数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,这样的数就是素数,也就是说一个素数除了1和它本身以外不再有其他的......
  • 写一个函数判断是不是素数
    #include<stdio.h>#include<math.h>intis_prime(intn){ intj=0; for(j=2;j<=sqrt(n);j++) {  if(n%j==0) return0; } //if(j==n); return......
  • 循环~分拆素数和
    题目描述把一个偶数拆成两个不同素数的和,有几种拆法呢?输入输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。输出对应每个偶数,输出其拆成不同素......
  • 列出前多少个素数
    #include<stdio.h>intmain(){intx=2;intcnt=0;//for(x=2;x<100;x++)while(cnt<5000000){inti;intisPrime=1;......
  • 列出100以内的素数
    1#include<stdio.h>2intmain()3{4intx;5for(x=2;x<100;x++)6{7inti;8intisPrime=1;9for(i=2;i<x;i+......
  • 素数
    //#define_CRT_SECURE_NO_WARNINGS1//#include<stdio.h>////////intsushu(intn)//{//intj;//for(j=2;j<n;j++)//{//if(n%j==0)//return0......
  • 将1000内素数放入数组
    #include<stdio.h>intmain(){inti=0;intj=0;inttemp=0;intarr[1000]={};for(i=2;i<1000;i++){ for(j=2;j<i;j++){ if(i%j==0){ break;}} if(......