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

C++の配列内の倍数のカウントのクエリ


この問題では、それぞれ値mで構成されるarr[]クエリとQクエリが与えられます。私たちのタスクは、C++の配列内の倍数のカウントのクエリを解決するプログラムを作成することです。

問題の説明

クエリを解くには、mの倍数であるすべての数を数える必要があります。このために、mで割り切れる要素をチェックします。

問題を理解するために例を見てみましょう

入力 :arr [] ={4、7、3、8、12、15}

Q =3 query [] ={2、3、5}

出力 :3 3 1

説明

クエリ1:m =2、配列内の倍数=4、8、12。カウント=3。

クエリ2:m =3、配列内の倍数=3、12、15。カウント=3。

クエリ3:m =5、配列内の倍数=15。カウント=1。

ソリューションアプローチ

簡単な解決策は、クエリ値ごとに配列をトラバースし、mで割り切れる配列の要素の数を数えることです。

#include <iostream>
using namespace std;
int solveQuery(int arr[], int N, int m){
   int count = 0;
   for(int i = 0; i < N; i++){
      if(arr[i]%m == 0)
         count++;
   }
   return count;
}
int main(){
   int arr[] = {4, 7, 3, 8, 12, 15};
   int N = sizeof(arr)/sizeof(arr[0]);
   int Q = 3;
   int query[] = {2, 3, 5};
   for(int i = 0; i < Q; i++)
      cout<<"The count of multiples in array "<<solveQuery(arr, N,query[i])<<endl;
   return 0;
}

出力

The count of multiples in array 3
The count of multiples in array 3
The count of multiples in array 1

このソリューションは、時間計算量をO(Q * n)にするクエリごとに1回配列をトラバースします。

より良い解決策は、エラトステネスのふるいを使用してすべての倍数を見つけることです

指定された配列の要素数。アイデアは、配列の最大値までのすべての要素の倍数のカウントを事前に計算することです。次に、事前に計算された配列を呼び出して、クエリの倍数の数を見つけます。

#include <bits/stdc++.h>
using namespace std;
int preCalcCount[10001];
void PreCalculateMultiples(int arr[], int N){
   int maxVal = *max_element(arr, arr + N);
   int count[maxVal + 1];
   memset(count, 0, sizeof(count));
   memset(preCalcCount, 0, (maxVal + 1) * sizeof(int));
   for (int i = 0; i < N; ++i)
      ++count[arr[i]];
   for (int i = 1; i <= maxVal; ++i)
      for (int j = i; j <= maxVal; j += i)
         preCalcCount[i] += count[j];

}
int main(){
   int arr[] = {4, 7, 3, 8, 12, 15};
   int N = sizeof(arr)/sizeof(arr[0]);
   int Q = 3;
   int query[Q] = {2, 3, 5};
   PreCalculateMultiples(arr, N);
   for(int i = 0; i < Q; i++)
      cout<<"The count of multiples in array"<<preCalcCount[query[i]]<<endl;
   return 0;
}

出力

The count of multiples in array 3
The count of multiples in array 3
The count of multiples in array 1

  1. C++の配列内のすべての要素に最も近い値を検索します

    ここでは、配列内のすべての要素に最も近い値を見つける方法を説明します。要素xに、それよりも大きい次の要素があり、配列にも存在する場合、それはその要素のより大きな値になります。要素が存在しない場合は、-1を返します。配列要素が[10、5、11、6、20、12]であるとすると、大きい方の要素は[11、6、12、10、-1、20]になります。 20は配列内でそれ以上の値を持たないため、-1を出力します。 これを解決するために、C++STLのセットを使用します。セットは、バイナリツリーアプローチを使用して実装されます。二分木では、常に順序の後続が次に大きい要素です。したがって、O(log n)時間で

  2. 配列要素の乗算のためのC++プログラム

    整数要素の配列で与えられ、タスクは配列の要素を乗算して表示することです。 例 Input-: arr[]={1,2,3,4,5,6,7} Output-: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 Input-: arr[]={3, 4,6, 2, 7, 8, 4} Output-: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 以下のプログラムで使用されるアプローチは次のとおりです − 一時変数を初期化して、最終結果を1で格納します ループを0からnまで開始します。nは配列のサイズです 最終結果を得るには、tempの値にarr[i]を掛け続