【模板】埃拉托色尼篩法(埃氏篩)

一、算法簡介

在數論與編程競賽中,求解 [ 1 , n ] [1,n] [1,n] 范圍內的所有質數是常見的基礎問題。埃拉托色尼篩法(Sieve of Eratosthenes) 是一種古老而高效的算法,可以在 O ( n log ? log ? n ) O(n \log \log n) O(nloglogn) 的時間復雜度內完成這一任務。


二、基本思想

埃氏篩的核心思想是:

對于每一個從小到大的質數 p p p,將其所有的倍數( 2 p , 3 p , 4 p , … 2p, 3p, 4p, \dots 2p,3p,4p,)標記為合數。
最終,所有未被標記的數就是質數。

舉例說明:
n = 30 n = 30 n=30,初始認為 2 ~ 30 2\sim 30 230 都是質數。
我們從 2 2 2 開始,依次把 4 , 6 , 8 , … 4,6,8,\dots 4,6,8, 標記為合數;
然后處理下一個未被標記的 3 3 3,再把 6 , 9 , 12 , … 6,9,12,\dots 6,9,12, 標記為合數;
如此反復,直到 n \sqrt{n} n ?


三、代碼實現

以下是使用 C++ 編寫的埃氏篩標準模板

#include<iostream>
#include<vector>
using namespace std;const int N = 1e5 + 10; // 設置一個足夠大的常數N,表示數組大小vector<bool> ans(N, true); // 初始化素數表,默認所有數都是素數(true)
vector<int> nums;          // 用于存儲最終得到的所有質數// 篩法主函數:獲取1到n之間的所有素數
void get(int n)
{ans[0] = ans[1] = false; // 0 和 1 不是質數,直接標記為 false// 使用埃氏篩法,從 2 開始依次判斷for (int i = 2; i <= n / i; i++)  // 等價于 i * i <= n{if (ans[i]) // 如果當前數 i 是質數(尚未被篩掉){// 從 i*i 開始,而不是 2*i:// 因為 i < j < i*i 范圍內的 i 倍數,如 2*i, 3*i 等,已被更小的質數篩掉了for (int j = i * i; j <= n; j += i) // 枚舉 i 的所有倍數{ans[j] = false; // 將 j 標記為合數}}}// 將所有的質數加入 nums 數組for (int k = 2; k <= n; k++){if (ans[k]){nums.push_back(k);}}
}

主函數調用如下:

int main()
{int n;cin >> n; // 輸入要求篩到的最大范圍get(n); // 執行篩法for (auto num : nums){cout << num << " "; // 輸出所有質數}return 0;
}

四、關鍵優化說明

1. 為什么從 i * i 開始篩?

因為在遍歷到質數 i i i 時,小于 i i i 的質數已經處理了 2 i , 3 i , . . . , ( i ? 1 ) i 2i, 3i, ..., (i-1)i 2i,3i,...,(i?1)i 的倍數。例如:

  • 6 = 2 × 3 6 = 2 \times 3 6=2×3 會在處理 2 2 2 時被篩掉;
  • 9 = 3 × 3 9 = 3 \times 3 9=3×3 會在處理 3 3 3 時被篩掉。

因此,從 i × i i \times i i×i 開始可以減少重復標記,提升效率。

2. 循環條件 i <= n / i

等價于 i * i <= n,這種寫法可避免整數溢出,建議記住作為一種 防溢出技巧


五、時間與空間復雜度

  • 時間復雜度 O ( n log ? log ? n ) O(n \log \log n) O(nloglogn),非常高效
  • 空間復雜度 O ( n ) O(n) O(n),主要用于布爾數組 ans[]

六、樣例輸入輸出

輸入:

100

輸出:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

七、適用場景與拓展

  • 快速判斷一個數是否為質數(配合布爾數組)
  • 枚舉某范圍內的所有質數(如用于歐拉函數、積性函數計算)
  • 可拓展為線性篩(Euler 篩)以避免重復標記(時間復雜度為 O ( n ) O(n) O(n)

八、結語

埃拉托色尼篩法是數論的入門利器,是多種算法的基礎工具。建議熟練掌握并牢記模板結構。同時要理解從 i * i 開始標記的數學依據,避免盲記公式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83738.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI Agent實戰 - LangChain+Playwright構建火車票查詢Agent

本篇文章將帶你一步步構建一個智能火車票查詢 Agent&#xff1a;你只需要輸入自然語言指令&#xff0c;例如&#xff1a; “幫我查一下6月15號從上海到南京的火車票” Agent就能自動理解你的需求并使用 Playwright 打開 12306 官網查詢前 10 條車次信息&#xff0c;然后匯總結果…

RabbitMQ的交換機和隊列概念

&#x1f3ea; 場景&#xff1a;一個外賣平臺的后臺系統 假設你開了一家在線外賣平臺&#xff1a; 飯店是消息的生產者&#xff08;Producer&#xff09;顧客是消息的消費者&#xff08;Consumer&#xff09;你開的外賣平臺就是RabbitMQ消息系統 &#x1f501; 第一部分&…

德國馬克斯·普朗克數學研究所:幾何朗蘭茲猜想

2025年科學突破獎 4月5日在美國洛杉磯揭曉&#xff1a;數學突破獎&#xff1a;德國馬克斯普朗克數學研究所&#xff1a;幾何朗蘭茲猜想 德國馬克斯普朗克數學研究所&#xff08;Max Planck Institute for Mathematics, MPIM&#xff09;在幾何朗蘭茲猜想的研究中扮演了核心角色…

TerraFE 腳手架開發實戰系列(一):項目架構設計與技術選型

TerraFE 腳手架開發實戰系列&#xff08;一&#xff09;&#xff1a;項目架構設計與技術選型 前言 在前端開發中&#xff0c;項目初始化往往是一個重復且繁瑣的過程。每次新建項目都需要配置 webpack、安裝依賴、設置目錄結構等&#xff0c;這些重復性工作不僅浪費時間&#…

準確--CentOS 7.9在線安裝docker

一、安裝Docker前的準備工作 操作系統版本為CentOS 7.9&#xff0c;內核版本需要在3.10以上。確保能夠連通互聯網&#xff0c;為避免網絡異常&#xff0c;建議關閉Linux的防火墻&#xff08;生產環境下請根據實際情況設置防火墻出入站規則&#xff09;。 # 查看內核版本 sudo…

中興B860AV1.1強力降級固件包

中興B860AV1.1強力降級固件包 關于中興b860av1.1頑固盒子降級教程終極版 將附件解壓好以后&#xff0c;準備一個8G以下的U盤重新格式化為FAT32格式后&#xff0c;并插入電腦 將以下文件及文件夾一同復制到優盤主目錄下&#xff08;見下圖&#xff09; 全選并復制到U盤主目錄下&…

nacos-作為注冊中心與springcloud整合(三)

前一篇文章nacos-簡介和初體驗&#xff08;一&#xff09;我們已經在服務器部署了nacos應用了。 在另外一篇文章中nacos-作為配置中心與springcloud整合&#xff08;二&#xff09;已經作為配置中心整合到springcloud 接下來讓我們嘗試把nacos作為注冊中心和springcloud中整合&…

Seata的TC(事務協調器)高可用如何實現?

Seata的TC&#xff08;事務協調器&#xff09;確實運行在Seata服務進程中&#xff0c;其高可用實現和宕機恢復主要通過以下機制實現&#xff1a; 一、高可用架構 集群部署 多TC節點組成集群&#xff0c;通過注冊中心&#xff08;如Nacos&#xff09;實現服務發現采用Raft協議實…

Mac安裝docker desktop

一、背景 最近在學習Spring AI&#xff0c;于是在GitHub上找了個開源項目&#xff0c;個人覺得還是比較適合有Java基礎和AI基礎的同學學習的。GitHub地址如下&#xff1a; https://github.com/qifan777/dive-into-spring-ai 但是看了下運行環境需要 MySQL 8 Redis-Stack n…

【算法深練】二分答案:從「猜答案」到「精準求解」的解題思路

目錄 前言 二分求最小值 1283. 使結果不超過閾值的最小除數 2187. 完成旅途的最少時間 1011. 在 D 天內送達包裹的能力 875. 愛吃香蕉的珂珂 3296. 移山所需的最少秒數 475. 供暖器 2594. 修車的最少時間 1482. 制作 m 束花所需的最少天數 3048. 標記所有下標的最早秒…

基于RK3588,飛凌教育品牌推出嵌入式人工智能實驗箱EDU-AIoT ELF 2

在AIoT技術驅動產業變革的浪潮中&#xff0c;嵌入式人工智能已成為工業物聯網、智慧交通、智慧醫療等領域創新突破的關鍵引擎。飛凌嵌入式教育品牌ElfBoard立足產業前沿&#xff0c;重磅推出嵌入式人工智能實驗箱EDU-AIoT ELF 2&#xff0c;以“軟硬協同、產教融合”為設計理念…

51單片機-IO擴展模塊 pcf8575

PCF8575介紹 PCF8575 是 NXP&#xff08;原飛利浦半導體&#xff09;生產的一款通用 IC 總線 I/O 擴展器芯片&#xff0c;主要用于微控制器&#xff08;如 Arduino、STM32 等&#xff09;的 I/O 端口擴展。 主要特性 16位并行 I/O 端口&#xff1a;可以配置為輸入或輸出 IC 總…

Python3 學習(菜鳥)-02基本數據類型

1.多變量賦值 多變量被賦予相同的數值 多變量被賦予不同的數值 2.數值運算 除法 /&#xff1a;返回一個浮點數 除法 //&#xff1a;返回一個整數 3.列表 加號和星號 加號 是列表連接運算符 星號 * 是重復操作 list [ abcd, 786 , 2.23, runoob, 70.2 ] # 定義一個…

『uniapp』搜索功能+商品列表滾動效果(詳細圖文注釋)

目錄 預覽效果準備工作代碼分析與思路1. 頁面結構主容器:`menber-container`搜索框:`u-search-inner`菜單:`u-menu-wrap`2. 數據模型`data()` 中的數據定義:3. 生命周期`onLoad(options)``onReady()``mounted()`4. 方法`search()``searchClear()``swichMenu(index)``getElRe…

微服務--消息隊列mq

1. mq簡介 消息隊列是分布式系統中的異步通信中間件&#xff0c;采用"生產者-消費者"模型實現服務間解耦通信 核心作用 服務解耦異步處理流量削峰數據同步最終一致性 消息隊列模式 發布/訂閱模式&#xff1a;一對多廣播工作隊列模式&#xff1a;競爭消費死信隊列…

第26節 Node.js 事件

Node里很多對象會分發事件&#xff1a; 每次有連接的時候net.Server會分發事件&#xff0c;當文件打開的時候fs.readStream會分發事件。所有能分發事件的對象都是 events.EventEmitter的實例。通過require("events");能訪問這個模塊。 一般來說&#xff0c;事件名都…

LangChain + MCP + vLLM + Qwen3-32B 構建本地私有化智能體應用

一、私有化智能體應用 在本專欄的前面文章基于Spring AI MCP實現了本地 ChatBI 問答應用&#xff0c;本文還是依據該場景&#xff0c;采用 LangChain vLLM Qwen3-32B MCP 技術棧構建該流程&#xff0c;整體過程如下圖所示&#xff1a; 實現效果如下所示&#xff1a; 關于 M…

AKS升級路線最佳實踐方案

前言 Kubernetes 社區大約每 4 個月發布次要版本&#xff0c;次要版本包括新增功能和改進。補丁發布更為頻繁&#xff08;有時每周都會發布&#xff09;&#xff0c;適用于次要版本中的關鍵 Bug 修復。修補程序版本包括針對安全漏洞或主要 bug 的修復。對于受支持版本列表以…

樹莓派智能小車基本移動實驗指導書

1.安裝LOBOROBOT庫函數 LOBOROBOT.py代碼如下&#xff1a; #!/usr/bin/python # -*- coding: utf-8 -*-import time import math import smbus import RPi.GPIO as GPIODir [forward,backward, ]class PCA9685:# Registers/etc.__SUBADR1 0x02__SUBADR2 …

如何對目標檢測算法RT-DETR進行創新和改進:突破瓶頸,提升性能!

更多精彩&#xff0c;詳見文末~~~ 在目標檢測的高速發展中&#xff0c;RT-DETR作為DETR&#xff08;DEtection TRansformer&#xff09;的高效變體&#xff0c;憑借其優異的性能和較快的推理速度&#xff0c;已經成為許多實際應用中的首選算法。然而&#xff0c;盡管RT-DETR在…