首页 > 其他分享 >素数筛法-欧拉筛-个人理解

素数筛法-欧拉筛-个人理解

时间:2022-11-25 12:55:51浏览次数:74  
标签:筛法 标记 int 素数 i% 欧拉

素数筛法-欧拉筛-个人理解

素数筛选有两种流派,一种是埃氏筛法,一种是欧拉筛,由于埃氏筛法很简单,而且效率没有欧筛效率高。因此本文介绍欧拉筛。

本文用另一种角度讲解为何在if(i%b[j]==0)时跳出循环,是个人理解,如有不正确的地方欢迎指点

#include<iostream>
using namespace std;
bool a[100001]={1,1};//i=0,i=1的时候都不是质数 ,所以直接标记
int b[100001];//存质数 
int k;	long long n;
int main()
{
	cin>>n;
	for(int i=2;i<=100001;i++)//这个意思是在100001里面找到质数并且标记 ,质数最小是2,所以i=2 
	{
		if (a[i]==0)	b[++k]=i;	//如果没有被标记为1,就是质数。我接下来会讲解为什么是质数。 
		for(int j=1;j<=k;j++)// //j小于当前所有的质数的个数
		{
			if(i*b[j]>100001)break;// 如果超出给出的范围,那么就退出循环 
			a[i*b[j]]=1;//用质数数依次×i,结果标记为合数(也就是标记为1)。 
			if(i%b[j]==0)break;//最关键的只标记一次 
		}	
	}
	for(int i=1;i<=n;i++) //你想查询的个数 
	{int m;
		cin>>m;//在100001里面输入你想查询的数
		if(a[m]==0)//如果没有被标记,就是质数,直接输出。 
		{
			cout<<m<<' ';
		}		
	}	
 } 

欧拉筛法和埃氏筛法一样,围绕{素数的倍数不是素数}筛选,但是欧拉筛为避免重复筛选,只会通过:最小素因子来消除。

if(i%b[j]==0)break;讲解:这时候不妨通过另一种视角,将变量ij循环的内层和外层作用是不一样的,在外层:很好理解,就是循环查看某个数是不是素数。在内存:将i理解成一个新的变量,它的作用是与b[j]相乘,从而筛选掉合数,关键是为什么会break呢?如果i%b[j]==0,表示i曾经被b[j]筛掉的,得赶紧退出,以防后面再被筛掉一次。

这里i%b[j]要跳出循环了,要注意这里的b[j]代表的是第j个素数,注意我们这里的标记是素数的是:i*b[j] 。是第j个素数的i倍,如果不跳出,在后面某一个素数的i倍可能与现在的第j个素数的i倍重复,即后面某一个素数的i倍可能是第j个素数的i倍的倍数,导致重复。
举个例子,假如现在第j个素数是3,i=33,后面某一个素数是11。那么i是素数3的倍数,也是素数11的倍数,如果在33%3==0时不退出的话,后面到了33%11==0时它又要在计算一次,重复

欢迎指正!

参考

https://blog.csdn.net/m0_57071296/article/details/119873446

https://blog.csdn.net/gaoqiandr/article/details/126871298

acwing

标签:筛法,标记,int,素数,i%,欧拉
From: https://www.cnblogs.com/swx123/p/16924773.html

相关文章

  • [c语言基础]如何判断素数
    素数又称质数。所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。思路1:因此判断一个整数m是否是素数,只需把m被......
  • 【Python】第4章-11 判断素数
    判断一个给定的正整数是否素数输入格式:输入在第一行给出一个正整数N(≤10),随后N行,每行给出一个小于1000000的需要判断的正整数输出格式:对每个需要判断的正整数,如果它......
  • 下面是用筛选法求100之内的素数,其实原理和上一个差不多,只是这里用到了数组以及不是用
    #include<stdio.h>#include<math.h>intmain(){inti,j,n,a[101];for(i=1;i<=100;i++){a[i]=i;}a[1]=0;for(i=2;i<sqrtf(100);i++){for(j=i+1;j<=100;j++){if(a[i]!=0&......
  • 如何用循环嵌套选出100-200的素数呢?
    #include<stdio.h>//使用到了sqrt这个开平方的数学库函数#include<math.h>intmain(){ inti,g,r,count; for(i=100;i<=200;i++) { intx=0; for(g=2;g<=sqrt(i);g++){/......
  • PAT乙级 —— 1003 数素数 (20)
    题目链接:​​数素数(20)​​题目描述令Pi表示第i个素数。现任给两个正整数M<=N<=10000,请输出PM到PN的所有素数。输入描述:输入在一行中给出M和N,其间以空格分隔。输出描......
  • 求素数
    #pragmawarning(disable:4996)#include<stdio.h>intmain(){intm=0;//m是初始值intn=0;......
  • 素数
    参考链接:https://cloud.tencent.com/developer/article/2054290 朴素素数:boolrule(intn){for(inti=2;i*i<=n;i++)if(n%i==0)returnfalse;ret......
  • 素数筛
    title:素数筛date:2022-11-1612:41:47tags:算法本文章遵守知识共享协议CC-BY-NC-SA,转载时需要署名,推荐在我的个人博客阅读。大意素数筛是一种快速在$[1,n]$......
  • 每日一题1--埃氏筛法学习
    我们今天要介绍的埃拉托斯特尼算法就是他发明的用来筛选素数的方法,为了方便我们一般简称为埃式筛法或者筛法。埃式筛法的思路非常简单,就是用已经筛选出来的素数去过滤所有......
  • 筛法瞎写
    看见APJifengc在写min25筛发现我这个东西都不会了。赶紧复习了一把去写点题。写一个更一个。loj6682梦中的数论答案显然\(\frac12\sum_{i=1}^n\binom{d(i)}{2}=\frac......