1. 程式人生 > >利用篩法得到質數表

利用篩法得到質數表

指整數在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。換句話說,只有兩個正因數(1和自己)的自然數即為素數。比1大但不是素數的數稱為合數。1和0既非素數也非合數。素數在數論中有著很重要的地位。

以上摘自百度百科。

利用篩法求質數的思路是,從最小的質數2開始,只要是2的倍數就肯定不是質數,同理,如果是3的倍數也不會是質數,那我們可以從低到高遍歷某個範圍內的所有的數,只要是從最小的質數開始,整數倍即篩去。最後把留下的數打印出來,即是此區間內的質數了。

程式碼如下:

// 找 出1000以內的素數(篩法)
//作 者:蘇 權


#include "stdafx.h"
#define PRIMELEN 1000
#define NUMLEN PRIMELEN+1
#define MIXPRIME 2//根據算術基本定理,每一個比1大的整數,要麼本身是一個質數,要麼可以寫成一系列質數的乘積。最小的質數是2。
int  GetPrimeNum()
{
char prime[NUMLEN]={0};
int i=0;
int index=MIXPRIME;
int n=0;
int countnum=0;
for (i=0;i<NUMLEN;i++)
{
prime[i]=1;
}


for (n=MIXPRIME;n<NUMLEN;)
{
for (i=n*2;i<NUMLEN;i=i+n)
{
//i=i*2;
prime[i]=0;

}

n++;
while (!prime[n])
{
if (n<NUMLEN)
{
n++;
}

}
//printf(" hit: %d\n",n);
}
for (i=MIXPRIME;i<NUMLEN;i++)
{
if (prime[i])
{
countnum++;
printf("%d\t",i);

else
{
;
}
}


return countnum;
}
int main(int argc, char* argv[])
{
printf("Prime number list:\n");
printf("\n\ntotal:%d\n",GetPrimeNum());
return 0;
}


相關推薦

利用得到質數

指整數在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。換句話說,只有兩個正因數(1和自己)的自然數即為素數。比1大但不是素數的數稱為合數。1和0既非素數也非合數。素數在數論中有著很重要的地位。 以上摘自百度百科。 利用篩法求質數的思路是,從最小的質數

列印質數【附:100000以內質數

發現在做ACM題目的時候經常會用到一些質數,因此使用埃拉託斯特尼篩法列印質數表以儲存之。 埃氏篩或愛氏篩,是一種公元前250年由古希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。 給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下

列舉質數

close ron mark 個數 set 因數 最小 技術 span 思想:標記出所有非質數,輸出所有未被標記的數。 對於n以內的篩選來說,如果n是合數,則有 1 ≤ c ≤ √n ,即 1 ≤ c2 ≤ n , c是n的最小正因數。只要找到了c就可以確定n是合數並將n標

使用列印質數

public static void main(String[] args) { //範圍:2到多少 int maxfanwei = 20; boolean[] bolist = new boolean[maxfanwe

質數 nsqrt(n)/nloglog(n)/n

lap display 既然 技術 printf bre nlog play 隨筆 數論第一篇隨筆,就講一下質數篩法吧 質數,也稱做素數,在數學中有著重要的地位,有很多問題與算法都與質數有關(比如給你的hash函數選擇一個好的質數可以讓你的RP++)。對質數的最基本操作,

埃拉托斯特尼-- c++求質數,用bitset類型

width src dac https ati dsta 質數 abs tar 要得到自然數n以內的全部素數,必須把不大於 的所有素數的倍數剔除,剩下的就是素數。 給出要篩數值的範圍n,找出以內的素數。 1既不是質數也不是合數,去掉; 先用2去篩,即把2留下,把2的倍數剔除

素數的獲取,素數線性介紹,複雜度超低

//素數線性篩法,複雜度:O(nloglogn) //求100以內素數 #include<iostream> #include<cstring> #include<string> using namespace std; bool vis[101];//

51nod 1181 質數中的質數質數

原題 參考了網上的大概縷清了思路,用自己的方法做一直都是編譯錯誤,不是很懂,請求大佬指點。 解題思路:首先建立prime[]陣列,用於判斷陣列中的下標所對應的值是質數還是非質數。若為質數,則標記為0,否則標記為1。 從2開始依次判斷,若該數為質數,則計數變數加1,再判斷

求小於等於整數n的所有質數

篩法求n以下的質數最核心的是確定其倍數未消去的最大數p應該滿足的條件。要消去q的倍數,最小應該從q*q考察起(因為其他跟小的倍數已經由2p,3p。。。(p-1)*p消去了) 那麼消去q的倍數只需從q*q開始 到n結束(滿足不等式q*q <=n). 以下是測試程式碼: #

質數篩選方法(埃拉託斯特尼

今天刷題刷了這麼一道題, The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. 大概意思是10以內的質數加法和為 2

(擴充套件)歐幾里演算法、素性測試、埃式、區間、快速冪運算

來自挑戰程式設計競賽2.6 數學問題的解題竅門 1.歐幾里得演算法 求解最大公約數,時間複雜度在O(log max(a,b))以內,可以看出,輾轉相除法是非常高效的 int gcd(int a,int b) { return (b==0)?a:gcd(b,a%b);

求N以內所有質數

題目:打印出給定數N以內的所有質數 解答: 使用篩法求N以內的所有質數 注意: 使用bitmap可以減少使用的空間,降低空間複雜度 程式碼: #include <iostream> #include <string.h> using namesp

【Coding】用求素數的C++實現(附100000以內素數

#include <cstdio> #include <cstring> using namespace std; #define MAXN 1000000+100 bool arr[MAXN]; void findPrime(int

存下十萬(100000)以內的所有素數,方便以後打或者雜湊使用,另附

#include <iostream> #include<math.h> using namespace std; bool vis[10000100]; int main() { freopen("2.txt","w",stdout); int

簡單因式分解及利用質數進行因式分解

簡單因式分解 簡單因式分解,不用質數表,比較簡單,就不註釋了 int i, n; n = 500; printf("%d = ", n); for(i = 2; i * i <= n;) { if(n % i == 0) { printf("

BZOJ 2818: 尤拉求gcd(x,y)==k(k為質數

Description 給定整數N,求1<=x,y<=N且Gcd(x,y)為素數的 數對(x,y)有多少對. Input 一個整數N Output 如題 Sample Input 4 Sample Output 4 Hint

質數(Prime Number 素數)的方法——厄拉多塞

質數又稱素數。指在一個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。換句話說,只有兩個正因數(1和自己)的自然數即為素數。比1大但不是素數的數稱為合數。1和0既非素數也非合數。合數是由若干個質數相乘而得到的。所以,質數是合數的基礎,沒有質數就沒有合數。

abap中利用BINARY SEARCH 二分查詢內記錄時注意項

abap中利用BINARY SEARCH 二分法查詢內表記錄時需要注意:一定要按要查詢的列進行排正序。 如下程式碼所示:  SORT itvbap BY vbeln posnr matnr.  CL

[原創]求質數(C語言描述)

問題描述 試編寫一個程式,找出 2→N 之間的所有質數(質數的概念請看這裡),用盡可能快的方法實現。 問題分析 這個問題可以有兩種解法:一種是用“篩子法”,另一種是從 2→N 逐一檢測出質數。如果要了解“除餘法”,請看另一篇文章《求質數 之 除餘法》。 先通過一個簡單的例子來

POJ3292 UVA11105 Semi-prime H-numbers【

問題簡述:參見上述連結。 問題分析: H-number:4n+1的數,n>=0,例如1,5,9,13,17,21,......。 H-prime:H-number數並且其因子只有1和它本身。 H-semi-prime:兩個H-prime的乘積。 H-composit