基礎演算法(二)篩法求素數
1.基本思想
把從1開始的、某一範圍內的正整數從小到大順序排列, 1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然後去掉它的倍數。依次類推,直到篩子為空時結束。
2.示例
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
1)1不是素數,去掉。剩下的數中 2 最小,是素數,去掉 2 的倍數。
12 34567891011
12131415161718192021
222324252627282930
2)剩下的數中,3 最小,是素數,去掉 3 的倍數。
2 3 5 7
911 13
1517 19
2123 252729
3)直到所有的數被篩完
2 3 5 7
11 13 17 19
23
2529
4)求出的素數為:
2 3 5 7 11 13 17 19 23 29
3.程式碼實現
//----*----*----*-----
//程式名稱:篩法求素數
//編譯環境:VC++ 6.0
// 作 者:Bee_darker
//修改日期:2018-11-01
//----*----*----*-----
#include "stdio.h"
#define MAX 30 //求MAX範圍內的素數
bool isprime[MAX]; //布林型變數
int su[MAX],count = 0; //全域性變數
//判斷函式
void prime()
{
int i,j;
for(i = 0;i <= MAX;i++)
isprime[i] = 1; //認為所有數都是素數
isprime[0] = isprime[1] = 0; //0和1不是素數
for(i = 2;i <= MAX;i++)
{
if(isprime[i])
su[count++] = i; //儲存素數
for(j = i*2; j <= MAX;j += i)
isprime[j] = false; //去除素數的倍數
}
}
int main()
{
prime();
int i;
for(i = 0;i < count;i++) //輸出素數
printf("%d ",su[i]);
return 0;
}
相關推薦
基礎演算法(二)篩法求素數
1.基本思想 把從1開始的、某一範圍內的正整數從小到大順序排列, 1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然後去掉它的倍數。依次類推,直到篩子為空時結束。 2.示例 1 2 3 4
基礎演算法(二):Kmeans聚類演算法的基本原理與應用
Kmeans聚類演算法的基本原理與應用 內容說明:主要介紹Kmeans聚類演算法的數學原理,並使用matlab程式設計實現Kmeans的簡單應用,不對之處還望指正。 一、Km
影象處理基礎知識(二)—— 中心矩求主軸方向
本文內容:主要介紹中心矩的定義,以及利用中心矩求取影象主軸方向。 1.4 matlab求取歸一化中心矩、hu不變矩和主軸方向 function test % atan(phi) 值域為[-90,90] atan2(y,x) 值域為[-180,180] %
JD 題目1040:Prime Number (篩法求素數)
rime 簡單 set end std tdi href num mod OJ題目:click here~~ 題目分析:輸出第k個素數 貼這麽簡單的題目,目的不清純 用篩法求素數的基本思想是:把從1開始的、某一範圍內的正整數從小到大順序排列
#數論# 快速分解質因數的技巧 && 篩法求素數(快速篩)
快速分解質因數 在做題時經常遇到要分解質因數,那麼如何快速分解質因數呢? 在用篩法求素數時,我們使用線性篩的方法,並在每次篩的過程中,記錄下每個數的最小質因數。那麼在分解質因數的時候,只需要不斷除以當前數的最小質因數,就可以快速得到分解的質因數了。 給出一個簡單的例子,比如我們要求
程式設計與演算法(二)演算法基礎_北京大學 學習筆記(一)
第一週 列舉 所有題目用python實現 例題1 完美立方 N=int(input ('N=')) for a in range(3,N+1): for b in range(
最優化演算法(二):牛頓法
1.推導 牛頓法和擬牛頓法是求解無約束最優化問題的常用方法,它們比梯度下降收斂更快。考慮同樣的一個無約束最優化問題:
【Coding】用篩法求素數的C++實現(附100000以內素數表)
#include <cstdio> #include <cstring> using namespace std; #define MAXN 1000000+100 bool arr[MAXN]; void findPrime(int
C++基礎知識(二)--左值右值--邏輯表示式求值優化--逗號運算子與表示式
一、C++左值右值概念 左值:c++將變數名代表的單元稱為左值,而將變數的值稱為右值,左值必須是記憶體中可以訪問且可以合法修改的物件,因此只能是變數名,而不能是常量或表示式。即左值可以定址。 右值:將變數的值稱為右值,由運算操作(加減乘除,函式呼叫返回值等)所產生的中間結果(沒有名字的結果)稱為右
C++基礎知識(二)--左值右值--邏輯表達式求值優化--逗號運算符與表示式
-- 沒有 加減乘除 p s 能夠 表示 操作 逗號 因此 一、C++左值右值概念 左值:c++將變量名代表的單元稱為左值,而將變量的值稱為右值,左值必須是內存中可以訪問且可以合法修改的對象,因此只能是變量名,而不能是常量或表達式。即左值可以尋址。 右值:將變量的值
機器學習金典演算法(二)--梯度下降法(2)
機器學習金典演算法(二)–梯度下降法 本人上篇博文梯度下降法(1)解釋了梯度下降法在機器學習中位置及思想,本文將繼續討論梯度下降法,梯度下降法存在的問題及改進思路,以及現有的幾種流行的變種梯度下降法。 目錄
GIF影象格式(二)——基礎演算法(下)
initialze_string_table(root_number); last_code = -1;
#數論# 快速分解質因數的技巧 && 篩法求素數(快速篩)
快速分解質因數 在做題時經常遇到要分解質因數,那麼如何快速分解質因數呢? 在用篩法求素數時,我們使用線性篩的方法,並在每次篩的過程中,記錄下每個數的最小質因數。那麼在分解質因數的時候,只需要不斷除以當前數的最小質因數,就可以快速得到分解的質因數了。 給出一個簡單的例子,
算法系列之九:計算幾何與圖形學有關的幾種常用演算法(二)
3.6 用向量的叉積判斷直線段是否有交 向量叉積計算的另一個常用用途是直線段求交。求交演算法是計算機圖形學的核心演算法,也是體現速度和穩定性的重要標誌,高效並且穩定的求交演算法是任何一個CAD軟體都必需要重點關注的。求交包含兩層概念,一個是判斷是否相交,另一個是
Carmichael Numbers 數論(快速冪取模 + 篩法求素數)
M - Carmichael Numbers Time Limit:3000MS Memory Limit:0KB 64bit IO Fo
快速線性篩法求素數 (模板+簡單解釋)
首先明確任何合數都能表示成一系列素數的積 第一種易於理解的方法: 注意對1的預處理即可,空間較大 var n,m,x,t :longint; i,j
篩法求素數(C語言/C++)
什麼是素數 定義 在大於1的自然數中,除了1和它本身以外不再有其他因數的數稱為質數。 C語言實現判斷素數 int prime(int x) { for(int i=2;i*i&
演算法學習之排序演算法(二)(直接插入排序法)
1、插入法排序原理 直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子序列中的適當位置,直到全部記錄插入完成為止。 設陣列為a[0…n-1]。 1. 初始時,a[0]自成1
webpack基礎使用(二)
-- pts nbsp port pat string類 abp dirname pac webpack.config.js文件的配置:輸入:module.exports={
數據結構系列(二)算法
nal log 如何 空間復雜度 計算 youdao 最好 時間 bsp 高斯求和 計算1+2+...+100 算法的概念就不多說了 強調一點就是,沒有通用的算法,就像永遠沒有銀彈,所有的算法都有自己的適用領域 評判算法好壞的方法 復雜度用大O表示,又分為時間復雜度