pta7-2 求素數個數
求素數的個數。本題要求編寫乙個程式,求1~n的素數個數。 要求至少給出兩種解法,對於相同的n,給出這兩種解法的結果,通過相關資料進行測試,目的是通過對比同一問題不同解法的絕對執行時間體會如何設計「好」的演算法。
輸入格式:
輸入在一行中給出1個整數n(<= 10 000 000)。
輸出格式:
對每一組輸入,在一行中輸出1~n的素數個數。
輸入樣例1:
5輸出樣例1:
3輸入樣例2:
14輸出樣例2:
6
#include
#include
#include
//memset函式標頭檔案
using
namespace std;
const
int max_n=
10000100
;bool p[max_n]
;int pr[max_n]
;void
euler()
}}intmain()
cout << count << endl;
return0;
}
memset函式
memset:char型初始化函式
標頭檔案:或
函式原型:void *memset(void *s , int ch , size_t n )
memset(結構體/陣列名 , 用於替換的ascii碼對應字元 , 前n個字元 );
memset(結構體/陣列名 , "用於替換的字元「 , 前n個字元 );
函式解釋:將s中的前n個位元組用ch替換並且返回s
函式作用:在一段記憶體塊中填充某乙個給定的值,常用於較大的對結構體和陣列的清零操作。
memset()函式原型是extern void *memset(void *buffer, int c, int count) buffer:為指標或是陣列,
c:是賦給buffer的值,
count:是buffer的長度.
這個函式在socket中多用於清空陣列.
如:原型是memset(buffer,0,sizeof(buffer))
memset 用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為『 』或『/0』;
在本題中,一開始首先想到的是c和c++中學到的求素數的方法,但是在當中發現執行超時,他人告知有求素數的另外方法,即尤拉篩法和埃氏篩法,但是埃氏篩法也是超時的
尤拉篩法
尤拉篩法的基本思想 :在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的。
** :
int prime[maxn]
;int visit[maxn]
;void
prime()
for(
int j =
1; j <=prime[0]
&& i*prime[j]
<= maxn; j++)}
}}
1.對於visit[i*prime[j]] = 1 的解釋: 這裡不是用i的倍數來消去合數,而是把 prime裡面紀錄的素數,公升序來當做要消去合數的最小素因子。
現i在消去合數中的作用是當做倍數的。
2.對於 i%prime[j] == 0 就break的解釋 :當 i是prime[j]的倍數時,i = kprime[j],如果繼續運算 j+1,i * prime[j+1] = prime[j] * k prime[j+1],這裡prime[j]是最小的素因子,當i = k * prime[j+1]時會重複,所以才跳出迴圈。
舉個例子 :i = 8 ,j = 1,prime[j] = 2,如果不跳出迴圈,prime[j+1] = 3,8 * 3 = 2 * 4 * 3 = 2 * 12,在i = 12時會計算。因為尤拉篩法的原理便是通過最小素因子來消除。
求素數個數
我最近在leetcode上擼了乙個小演算法,雖然已經工作了五年,當看到每次 提交後排名的提公升,內心依然很有成就感。題目比較簡單,求小於n的素數個數,素數也叫質數,具有以下特點 根據上面的特點,我們還可以推斷出 依據這一點,我們可以寫出下面的實現 class solution intcount 1 ...
MPI求素數個數
附上另乙個呼叫函式後針對乙個輸入正確 include stdafx.h include mpi.h include stdio.h include string.h include math.h int isprime int n return flag int main int argc,char...
48 求質數 素數 個數
48 求質數 素數 個數 問題描述 求出所有的大於等於n小於等於m的質數,統計其數目。n m 輸入說明 你的程式需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資料。每組一行,每行包含兩個整數n m n m都不大於20000 兩組資料之間沒有多餘的空行。在行首和行尾沒有多餘的空格。輸出說明 對每組測試...