线性筛选素数

news2024/9/23 19:17:36

线性筛选素数

问题

求取范围[2,n] 之间的所有素数

方法一

方法一概述

使用数字prime[i]来标记i是否为素数。初始化prime[2…n]=1。
当处理到数字i时,若prime[i]=0,则代表2到i-1中有i的因子,因此i为合数;若prime[i]=1,则代表2到i-1中无i的因子,因此i为素数,此时筛选掉ij(2<=j<=n/i),从而筛选掉以素数i为因子的合数ij。

方法一实现

#define SIZE 1000000

int main()
{
    int check[SIZE] = {0};//元素值为0代表是素数
    int prime[SIZE] = {0};
    int pos=0;
    int flag;
    for (int i = 2 ; i < SIZE ; i++)
    {
        if (!check[i])//如果是素数
            prime[pos++] = i;

        for (int j = 2*i ; j < SIZE ; j += i)
        {
            check[j] = 1;
        }
    }
    printf("%.2f", (double)clock()/CLOCKS_PER_SEC);

    return 0;
}

方法一问题

时间复杂度为 O ( n 2 ) O(n^2) O(n2),存在重复筛选的问题。对于6=2*3,会在i为2和3时被筛选掉。

方法二——线性筛法

方法二概述

目标:对于 m = p i a ∗ p j b ∗ . . . p k c m=p_i^{a}*p_j^{b}*...p_k^{c} m=piapjb...pkc,其中 p i < p j < . . . p k p_i<p_j<...p_k pi<pj<...pk,为了避免重复筛选,仅使用 p i p_i pi来筛选数 m m m,称 p i p_i pi为最小素因子。
策略:
使用prime数组来记录当前所得到的素数,使用is_prime[i]来标记数i是否被筛选。
对于当前数m,若其没有被筛选,则将其加入prime数组中。无论m是否为素数,遍历prime数组,来筛选掉以 p r i m e [ i ] prime[i] prime[i]为最小素因子且等于 m ∗ p r i m e [ i ] m*prime[i] mprime[i]的合数,为了确保 m ∗ p r i m e [ i ] m*prime[i] mprime[i]是以prime[i]为最小合数的,因此若出现 p r i m e [ i ] ∣ m prime[i]|m prime[i]m(即m中含有素因子 p r i m e [ i ] prime[i] prime[i]),将不在考虑使用 m ∗ p r i m e [ j ] ( j > i ) m*prime[j](j>i) mprime[j](j>i)来进行后续的筛选(因为此时的最小素因子为m的最小素因子 p r i m e [ i ] prime[i] prime[i]而非 p r i m e [ j ] prime[j] prime[j])。
覆盖性证明:
上述策略保证了使用最小素因子 p r i m e [ i ] prime[i] prime[i]来进行筛选,并通过prime[i]|m来避免了重复的筛选,即满足了一个数仅筛选一次的目标。
对于筛选的范围能否覆盖 [ 1... n ] [1...n] [1...n]中的所有数,由于m是从1到n遍历的,因此会考虑到所有 m ∗ p r i m e [ i ] ( m = 1... n ) m*prime[i](m=1...n) mprime[i](m=1...n)的情况(当 p r i m e [ i ] > m m i n prime[i]>m_{min} prime[i]>mmin时不予筛选, m m i n m_{min} mmin代表m的最小素因子,因为这不满足 p r i m e [ i ] prime[i] prime[i] m ∗ p r i m e [ i ] m*prime[i] mprime[i]为最小素因子的定义),因此所有以prime[i]为最小素因子的合数都会被筛选掉。
操作过程示例:
在这里插入图片描述

方法二实现

#include<iostream>
using namespace std;
#define NUM 20
void get_prime() {
	int is_prime[NUM] = { 0 };
	int prime[NUM];
	int prime_num = 0;
	for (int m = 2; m < NUM; m++) {
		//数m没有被筛选过
		if (!is_prime[m]) {
			prime[prime_num++] = m;
		}
		//筛选掉以prime[i]为最小素因子的合数m*prime[i]
		for (int i = 0; i < prime_num; i++) {
			if(m*prime[i]<NUM) is_prime[m * prime[i]] = 1;
			if (m % prime[i] == 0) break;//m*prime[j](j>i)的最小素因子为m的最小素因子prime[i]而非prime[j],因此跳出循环
		}
	}
	//打印输出
	for (int i = 0; i < prime_num; i++) {
		cout << prime[i] << " ";
	}
	cout << endl;
}
int main() {
	get_prime();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/900995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美团——城市低空物流无人机的设计挑战与应对

城市低空物流无人机的设计挑战与应对 强度分析 振动影响 动力设计 噪声设计 冗余备份更加性价比&#xff0c;便宜好实现 航电系统 动力系统的冗余 电池系统的冗余 通讯系统等冗余 降落冗余 安全降落 计算高效 产线标定 底层基础库 离线系统 行业公开测评 未来展望 – 导航定…

C运行时错误——error realloc(): invalid next size

在LeetCode做题时遇到一个运行时错误&#xff0c;将引起问题的原因记录一下备忘&#xff1a; 我们在malloc或calloc等API分配内存时&#xff0c;libc库除了分配给我们在参数中设定大小的内存&#xff08;可能会有内存对齐&#xff0c;实际分配的比参数设定的要多&#xff09;&…

LeetCode算法递归类—二叉树中的最大路径和

目录 124. 二叉树中的最大路径和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该…

STM32驱动OLED显示菜单功能(附带oled硬件iic驱动代码)

while循环里面就写菜单退出 菜单进入 static int flag1; //记录你的选择//if(return_FLAG1)return_FLAG0;OLED_GotoXY(10,0);OLED_Puts("1 LED_TEST",&Font_11x18,1);OLED_GotoXY(10,20);OLED_Puts("2 USART_TEST",&Font_11x18,1);OLED_GotoXY…

传输请求时,如若选择包含其他TR,请留意……

以下是纯顾问群~微信群&#xff1a;SAP干货铺&#xff0c;请联系本人微信 sapliumeng。QQ群 &#xff1a;SAP干货铺&#xff0c; 群号&#xff1a;775662808所有群管理严格&#xff0c;严格禁止一切外来链接、招聘、广告等垃圾信息! 这是之前頔哥在群里说过的一个知识点&#…

谷歌浏览器插件篇之console Importer

前言 作为一名前端开发者&#xff0c;相信在开发实践中&#xff0c;使用过诸多第三方库。譬如&#xff1a;lodash、moment、dayjs、antd等数不胜数。 然每每使用&#xff0c;经起繁琐&#xff0c;便令人有反抗之意。其步骤如下&#xff1a;首先要在搭建好的项目里&#xff0c…

Lnton羚通如何使用OpenCV-Python进行轮廓汇总?

在图像处理和计算机视觉领域&#xff0c;轮廓&#xff08;Contour&#xff09;是指图像中连续的边缘部分形成的曲线&#xff0c;可以看作是物体的外边界或者是物体内部区域的边界。轮廓可以用于对象检测、图像分割、形状匹配等任务。轮廓可以通过在二值化图像中找到图像中白色&…

JDK动态代理与CGLIB动态代理

一、代理模式概述 1.1.生活中代理案例 房屋中介代理 客户手里面没有房源信息&#xff0c;找一个中介 商品代购 这些代购者可以去拿到比较低成本的商品&#xff0c;拥有自己的渠道 1.2.为什么要使用代理 对于消费者而言&#xff0c;可以减少成本&#xff0c;只需要关心自己…

深入理解Linux内核--页高速缓存

页高速缓存 页高速缓存(page cache)是Linux内核所使用的主要磁盘高速缓存。 在绝大多数情况下&#xff0c;内核在读写磁盘时都引用页高速缓存。 新页被追加到页高速缓存以满足用户态进程的读请求。 如果页不在高速缓存中&#xff0c;新页就被加到高速缓存中&#xff0c;然后用…

无涯教程-TensorFlow - Keras

Keras易于学习的高级Python库&#xff0c;可在TensorFlow框架上运行&#xff0c;它的重点是理解深度学习技术&#xff0c;如为神经网络创建层&#xff0c;以维护形状和数学细节的概念。框架的创建可以分为以下两种类型- 顺序API功能API 无涯教程将使用Jupyter Notebook执行和…

ArduPilot开源飞控之飞行模式

ArduPilot开源飞控之飞行模式 1. 源由2. 飞行模式-已实现3. 飞行模式-设计3.1 模式初始化(init)3.2 模式退出(exit)3.3 模式任务(run)3.4 模式切换场景3.4.1 上电初始化3.4.2 EKF FAILSAFE触发3.4.3 do_failsafe_action FAILSAFE触发3.4.4 AP_Avoidance_Copter触发3.4.5 Crash触…

03_缓存双写一致性

03——缓存双写一致性 一、缓存双写一致性 如果redis中有数据&#xff0c;需要和数据库中的值相同如果redis中无数据&#xff0c;数据库中的值要是最新值&#xff0c;且准备回写redis 缓存按照操作来分&#xff0c;可以分为两种&#xff1a; 只读缓存 读写缓存 同步直写操作…

《游戏编程模式》学习笔记(七)状态模式 State Pattern

状态模式的定义 允许对象在当内部状态改变时改变其行为&#xff0c;就好像此对象改变了自己的类一样。 举个例子 在书的示例里要求你写一个人物控制器&#xff0c;实现跳跃功能 直觉上来说&#xff0c;我们代码会这么写&#xff1a; void Heroine::handleInput(Input input…

js简介以及在html中的2种使用方式(hello world)

简介 javascript &#xff1a;是一个跨平台的脚本语言&#xff1b;是一种轻量级的编程语言。 JavaScript 是 Web 的编程语言。所有现代的 HTML 页面都使用 JavaScript。 HTML&#xff1a; 结构 css&#xff1a; 表现 JS&#xff1a; 行为 HTMLCSS 只能称之为静态网页&#xff0…

ajax-axios-url-form-serialize 插件

AJAX AJAX 概念 1.什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest 对象 与服务器通信 浏览器网页中&#xff0c;使用 AJAX技术&#xff08;XHR对象&#xff09;发起获取省份列表数据的请求&#xff0c;服务器代码响应准备好的省份列表数据给前端&#xff0c;前端拿到数据数…

面试百问:Redis常见的故障以及发生场景

作为一个测试同学&#xff0c;被测系统架构中有使用到redis吗&#xff1f;对redis常见的故障有了解吗&#xff1f;又是如何进行测试的呢&#xff1f; 针对常见的redis面试问题&#xff0c;怎样才算一个高质量的回答呢&#xff0c;回答思路一般包括 问题的类型是什么&#xff…

Qt应用开发(基础篇)——高级纯文本窗口 QPlainTextEdit

一、前言 QPlainTextEdit类继承于QAbstractScrollArea&#xff0c;QAbstractScrollArea继承于QFrame&#xff0c;是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…

使用IDM下载视频出现“由于法律原因,IDM无法下载...

一、问题描述 由于法律原因,IDM无法下载..,如图: 二、原因分析 下载该IDM抓取的M3U8文件,查看其中的内容发现 : #EXT-X-KEY 字段已经写明了加密方式是AES-128,包含一个URI和IV值 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:8 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:…

【机器学习】处理不平衡的数据集

一、介绍 假设您在一家给定的公司工作&#xff0c;并要求您创建一个模型&#xff0c;该模型根据您可以使用的各种测量来预测产品是否有缺陷。您决定使用自己喜欢的分类器&#xff0c;根据数据对其进行训练&#xff0c;瞧&#xff1a;您将获得96.2%的准确率&#xff01; …

分析了下内网穿透技术,都在这了

内网穿透是一种将位于内网中的计算机或设备暴露给公网的技术&#xff0c;以便可以从外部网络访问这些设备。这在许多场景中非常有用&#xff0c;例如远程访问内网中的服务器、搭建本地 Web 服务器、共享文件等。 目前内网穿透一般都以下五种方案 目录 方案一&#xff1a;使用…