PTA資料結構7 2 求素數個數

2021-10-24 17:34:21 字數 1960 閱讀 2001

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 兩組資料之間沒有多餘的空行。在行首和行尾沒有多餘的空格。輸出說明 對每組測試...