1. 程式人生 > >基礎演算法(二)篩法求素數

基礎演算法(二)篩法求素數

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 的倍數。

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

2)剩下的數中,3 最小,是素數,去掉 3 的倍數。

  2          3          5           7          9

11          13        15          17       19

21          23        25          27        29

3)直到所有的數被篩完

2          3           5           7

11        13         17         19

23        25         29 

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表示,又分為時間復雜度