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

C++の別の配列の少なくとも1つの要素で割り切れる要素を数えます


2つの配列が与えられます。たとえば、arr_1[]とarr_2[]の両方に整数値が含まれ、タスクは、別の配列の少なくとも1つの要素で割り切れる要素の数を計算することです。これは、2番目の配列に少なくとも1つの要素(arr_2)がある要素をカウントする必要があることを意味します。

配列は、同じタイプの要素の固定サイズの順次コレクションを格納できる一種のデータ構造です。配列はデータのコレクションを格納するために使用されますが、配列を同じタイプの変数のコレクションと考える方が便利な場合がよくあります。

Input − int arr_1[] = {1, 2, 3, 4, 5}
      arr_2[] = {2, 6, 12, 15}
Output − count is 2

説明 − arr_1 []には5つの要素があり、arr_2[]には4つの要素があります。 arr_1[]のすべての要素はarr_2[]で割り切れます。したがって、カウントは5です。

Input − int arr_1[] = {1, 2, 3, 4, 5}
      arr_2[] = {13, 11}
Output − count is 0

説明 − arr_1 []には5つの要素があり、arr_2[]には2つの要素があります。 arr_1[]の要素はいずれもarr_2[]で割り切れません。したがって、カウントは0です。

以下のプログラムで使用されているアプローチは次のとおりです

  • たとえば、arr_1[]とarr_2[]

    の2つの配列を作成します。
  • 配列内の要素ごとに整数値を返すlength()関数を使用して、両方の配列の長さを計算します。

  • 要素の数を格納する一時変数を取ります。

  • unordered_set変数を作成してみましょう

  • iを0に設定し、iが2番目の配列のサイズよりも小さい場合にループを開始します。

  • ループ内でarr_2[i]に挿入を実行します。

  • iが0で、iが最初の配列のサイズよりも小さい場合に別のループを開始します。

  • ループ内で、jtoおよびj* j <=arr_1 [i]

    に対して別のループを開始します。
  • このチェック内で、arr_1 [i]%j =0の場合は、us.find(j)!=us.endまたはus.find(arr [i] / j)!=us.end()の場合は、カウントをインクリメントします。 1

  • そうでなければ、、休憩

  • 返品数

  • 結果を印刷します。

#include <iostream>
#include <unordered_set>
using namespace std;
// Function to count the number of elements
// in first array whose atleast one factor is
// present in the second array
int totalelements(int arr_1[], int size1, int arr_2[], int size2){
   // variable 'result' to count the number of elements
   int result = 0;
   // Hash of second array elements
   unordered_set<int> h;
   for (int i = 0; i < size2; i++){
      h.insert(arr_2[i]);
   }
   // traverse through array elements
   // and find its factors
   for (int i = 0; i < size1; i++){
      for (int j = 1; j * j <= arr_1[i]; j++){
         if (arr_1[i] % j == 0){
            // check if the factor is present in
            // second array using the h
            if ((h.find(j) != h.end()) || (h.find(arr_1[i] / j)!= h.end())){
               result++;
               break;
            }
         }
      }
   }
   return result;
}
// Main function
int main(){
   int arr_1[] = { 1, 2, 3, 4, 5 };
   int arr_2[] = { 2, 6, 12, 15 };
   int size1 = sizeof(arr_1) / sizeof(arr_1[0]);
   int size2 = sizeof(arr_2) / sizeof(arr_2[0]);
   cout <<"count is "<<totalelements(arr_1, size1, arr_2, size2);
   return 0;
}

出力

上記のコードを実行すると、次の出力が得られます-

count is 2

  1. C++で2つの要素が隣接しないような循環配列の最大合計

    この問題では、循環配列cirArr[]が与えられます。私たちのタスクは、C++で2つの要素が隣接しないように循環配列の最大合計を見つけるプログラムを作成することです。 問題の説明 循環配列の場合、隣接する要素を取得できないように、配列の要素の最大合計を見つける必要があります。つまり、代替要素を取得する必要があります。 循環アレイ は、配列の最後の要素が最初の要素に接続されている特殊なタイプの配列です。 問題を理解するために例を見てみましょう 入力 cirArr[] = {4, 1, 5, 3, 2} 出力 9 説明 最大合計循環サブシーケンスは[4、5、2]です。合計=9 ソリ

  2. C++の配列内の各要素のSurpasserCountを検索します

    1つの配列Aが与えられたと仮定します。その配列内の各要素の超過者の数を見つける必要があります。超過者は、現在の要素の配列の右側に存在するより大きな要素です。 A ={2、7、5、3、0、8、1}とすると、超過者は{4、1、1、1、2、0、0}であるため、2の右側には4つの数字があります。 4よりも多く、他の人にも同じルールがあります。解決策は非常に単純で、2つのネストされたループがあり、要素ごとに、超過者をカウントして、別の配列に格納します。 例 #include <iostream> using namespace std; void gerSurpassers(int arr[