目錄
尋找解決方案的方法
暴力破解
範例
輸出
高效方法
上述程式碼的解釋
結論
首頁 後端開發 C++ 使用C++編寫,找出子數組中的質數數

使用C++編寫,找出子數組中的質數數

Sep 01, 2023 am 08:37 AM
c語言 子數組 質數數量

使用C++編寫,找出子數組中的質數數

在本文中,我們將描述尋找子陣列中質數數量的方法。我們有一個正數數組 arr[] 和 q 個查詢,其中有兩個整數表示我們的範圍 {l, R},我們需要找到給定範圍內的質數數量。以下是給定問題的範例-

1

2

3

4

5

6

7

8

9

10

11

Input : arr[] = {1, 2, 3, 4, 5, 6}, q = 1, L = 0, R = 3

 

Output : 2

 

In the given range the primes are {2, 3}.

 

Input : arr[] = {2, 3, 5, 8 ,12, 11}, q = 1, L = 0, R = 5

 

Output : 4

 

In the given range the primes are {2, 3, 5, 11}.

登入後複製

尋找解決方案的方法

在這種情況下,我想到了兩種方法-

暴力破解

在這種方法中,我們可以採用範圍並找出該範圍內存在的質數數量。

範例

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

#include <bits/stdc++.h>

using namespace std;

bool isPrime(int N){

    if (N <= 1)

       return false;

    if (N <= 3)

       return true;

    if(N % 2 == 0 || N % 3 == 0)

       return false;

    for (int i = 5; i * i <= N; i = i + 2){ // as even number can&#39;t be prime so we increment i by 2.

       if (N % i == 0)

           return false; // if N is divisible by any number then it is not prime.

    }

    return true;

}

int main(){

    int N = 6; // size of array.

    int arr[N] = {1, 2, 3, 4, 5, 6};

    int Q = 1;

    while(Q--){

        int L = 0, R = 3;

        int cnt = 0;

        for(int i = L; i <= R; i++){

           if(isPrime(arr[i]))

               cnt++; // counter variable.

        }

        cout << cnt << "\n";

    }

    return 0;

}

登入後複製

輸出

1

2

登入後複製
登入後複製

但是,這種方法並不是很好,因為這種方法的整體複雜度是O(Q*N* √N),這不是很好。

高效方法

在這種方法中,我們將使用埃拉托斯特尼篩選法建立一個布林數組,告訴我們該元素是否是素數,然後遍歷給定的範圍並找出該數組中素數的總數。布爾數組。

範例

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

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

#include <bits/stdc++.h>

using namespace std;

vector<bool> sieveOfEratosthenes(int *arr, int n, int MAX){

    vector<bool> p(n);

    bool Prime[MAX + 1];

    for(int i = 2; i < MAX; i++)

       Prime[i] = true;

    Prime[1] = false;

    for (int p = 2; p * p <= MAX; p++) {

       // If prime[p] is not changed, then

       // it is a prime

       if (Prime[p] == true) {

           // Update all multiples of p

           for (int i = p * 2; i <= MAX; i += p)

               Prime[i] = false;

       }

    }

    for(int i = 0; i < n; i++){

        if(Prime[arr[i]])

           p[i] = true;

        else

           p[i] = false;

    }

    return p;

}

int main(){

    int n = 6;

    int arr[n] = {1, 2, 3, 4, 5, 6};

    int MAX = -1;

    for(int i = 0; i < n; i++){

        MAX = max(MAX, arr[i]);

    }

    vector<bool> isprime = sieveOfEratosthenes(arr, n, MAX); // boolean array.

    int q = 1;

    while(q--){

        int L = 0, R = 3;

        int cnt = 0; // count

        for(int i = L; i <= R; i++){

            if(isprime[i])

               cnt++;

       }

       cout << cnt << "\n";

   }

   return 0;

}

登入後複製

輸出

1

2

登入後複製
登入後複製

上述程式碼的解釋

這種方法比我們之前應用的蠻力方法要快得多,因為現在的時間複雜度是O(Q*N),也就是比以前的複雜度好得多。

在這種方法中,我們預先計算元素並將它們標記為素數或非素數;因此,這降低了我們的複雜性。除此之外,我們也使用埃拉托斯特尼篩法,這將有助於我們更快找到質數。在此方法中,我們透過使用素數因子標記數字,以 O(N*log(log(N))) 複雜度將所有數字標記為質數或非質數。

結論

在本文中,我們解決了使用埃拉托斯特尼篩選法在 O(Q*N) 中尋找子數組中素數數量的問題。我們也學習了解決這個問題的C 程序以及解決這個問題的完整方法(正常且有效率)。我們可以用其他語言寫相同的程序,例如C、java、python等語言。

以上是使用C++編寫,找出子數組中的質數數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

c語言中typedef struct的用法 c語言中typedef struct的用法 May 09, 2024 am 10:15 AM

c語言中typedef struct的用法

c語言中strcpy和strcat的區別 c語言中strcpy和strcat的區別 May 08, 2024 pm 01:03 PM

c語言中strcpy和strcat的區別

c語言中real是什麼意思 c語言中real是什麼意思 May 09, 2024 pm 12:06 PM

c語言中real是什麼意思

C語言乘方函數如何實現 C語言乘方函數如何實現 May 09, 2024 pm 11:33 PM

C語言乘方函數如何實現

c語言中scanf出現錯誤怎麼辦 c語言中scanf出現錯誤怎麼辦 May 09, 2024 am 11:39 AM

c語言中scanf出現錯誤怎麼辦

_complex在c語言中的用法 _complex在c語言中的用法 May 08, 2024 pm 01:27 PM

_complex在c語言中的用法

restrict在c語言的用法 restrict在c語言的用法 May 08, 2024 pm 01:30 PM

restrict在c語言的用法

_bool在c語言中是什麼意思 _bool在c語言中是什麼意思 May 08, 2024 pm 01:33 PM

_bool在c語言中是什麼意思

See all articles