C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++を使用して、指定された範囲クエリでプレフィックス合計素数の数を検索します


この記事では、正の整数の特定の配列arr[]と範囲クエリLの素数であるプレフィックス合計の数を見つける必要があります。 、 R 、ここで L prefixsum[]配列およびRの初期インデックス値arr[L]です。 は、検索する必要のあるプレフィックスの合計の数です。

プレフィックス合計配列を埋めるために、インデックスLからインデックスRに開始し、現在の値を指定された配列の最後の要素に追加します。これが問題の例です-

Input : arr[ ] = { 3, 5, 6, 2, 4 }
L = 1, R = 3
Output : 3
Explanation : prefixsum[ 0 ] = arr[ L ] = 5
prefixsum[ 1 ] = prefixsum[ 0 ] + arr[ 2 ] = 11
prefixsum[ 2 ] = prefixsum[ 1 ] + arr[ 3 ] = 13
In prefixsum[ ] array all three 5, 11 and 13 are prime numbers in prefix sum array in given range.

Input : arr[ ] = { 6, 10, 5, 8, 11 }
L = 0, R = 3
Output : 1
Explanation : prefixsum[ 0 ] = arr[ L ] = 6
prefixsum[ 1 ] = prefixsum[ 0 ] + arr[ 1 ] = 16
prefixsum[ 2 ] = prefixsum[ 1 ] + arr[ 2 ] = 21
prefixsum[ 3 ] = prefixsum[ 2 ] + arr[ 3 ] = 29
In prefixsum[ ] array only 29 is the prime number in prefix sum array given range.

解決策を見つけるためのアプローチ

問題を見ると、1つの新しい配列prefixsum []を作成し、prefixsum配列の前の要素と指定された配列の現在の要素を追加してその配列を埋める必要があると言えます。プレフィックス合計配列の最初の要素は、指定された配列のインデックスLの値になります。

LからRへのループを実行する必要があります。ここで、LとRは、指定された配列で処理するインデックスの範囲です。次に、prefixsum []配列の要素を確認し、見つかったすべての素数のカウントをインクリメントします。

#include<bits/stdc++.h>
using namespace std;
vector < bool > checkprime (int *arr, int n, int MAX){
    vector < bool > p (n);
    bool Prime_val[MAX + 1];
    for (int i = 2; i < MAX; i++)
        Prime_val[i] = true;
        Prime_val[1] = false;
    for (int p = 2; p * p <= MAX; p++){
        // If prime[p] is not changed, then
        // it is a prime
        if (Prime_val[p] == true){
            // Update all multiples of p
            for (int i = p * 2; i <= MAX; i += p)
                Prime_val[i] = false;
        }
    }
    for (int i = 0; i < n; i++){
        if (Prime_val[arr[i]])
             p[i] = true;
        else
        p[i] = false;
    }
    return p;
}
int main (){
    int arr[] = { 2, 3, 4, 7, 9, 10 };
    int s1 = sizeof (arr) / sizeof (arr[0]);//size of given array
    int L = 1, R = 3, s2 = R - L + 1;
    int prefixsum[s2];
    int count = 0;
    prefixsum[0] = arr[L];
    for (int i = L + 1, j = 1; i <= R && j < s1; i++, j++){
        prefixsum[j] = prefixsum[j - 1] + arr[i];

    }
    vector < bool > isprime = checkprime (prefixsum, s2, prefixsum[s2 - 1]);
    for (int i = 0; i < s2; i++) {
        if (isprime[i] == 1)
            count++;
    }
    cout <<"Number of prefix sum prime in given range query: " << count;
    return 0;
}

出力

Number of prefix sum prime in given range query: 2

上記のコードの説明

このコードでは、配列prefixsum []を作成し、prefixsum[]配列の前の要素と指定された配列の現在の要素の合計を入力します。その後、すべての数のプレフィックス配列の素数をチェックします。ここでは、エラトステネスのふるいアルゴリズムを使用して素数をチェックしています。最後に、各素数のカウントを増やして結果を表示します。

結論

この記事では、単純なアプローチを適用し、エラトステネスのふるいを使用して、特定の範囲クエリでいくつかのプレフィックス合計素数を見つけることを解決しました。 プレフィックス合計配列で素数を検索します。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。この記事がお役に立てば幸いです。


  1. C++を使用して停止ステーションの数を見つける

    ポイントXとYの間にn個の中間駅があります。2つの駅が隣接しないように、s駅に停車するように列車を配置できるさまざまな方法の数を数えます。そのため、この記事では、停車駅の数を見つけるためのあらゆる可能なアプローチについて説明します。問題を見ると、sの駅数で列車を止めることができる組み合わせを見つける必要があることがわかります。 問題を解決するためのアプローチ 中間駅が8つあり、3つの中間駅で電車を止める方法を見つける必要がある例を見てみましょう。 n = 8, s = 3 (n-s)、つまり電車が止まらない駅が5つ残っています 電車が止まらないA、B、C、D、Eの5つの駅があります

  2. C ++を使用して、指定されたポイントから可能な四辺形の数を見つけます

    四辺形は、ユークリッド平面幾何学で4つの頂点と4つのエッジを持つポリゴンを形成します。名前4-gonなど。四辺形の他の名前に含まれ、正方形、表示スタイルなどとしても知られています。 この記事では、与えられた点から可能な四辺形の数を見つけるためのアプローチを説明します。この問題では、デカルト平面に提供された4つの点(x、y)を使用して作成できる四辺形の数を調べる必要があります。だからここに与えられた問題の例があります- Input : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) Output : 1 Explanation : One quadr