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

a[i]とa[j]の積がC++で2の累乗になるように、非順序対(i、j)をカウントします。


N個の要素の配列が与えられます。目標は、i!=jのような完全な二乗である合計を持つすべてのペア(Arr [i]、Arr [j])の数を見つけることです。つまり、Arr [i] +Arr[j]は完全な正方形です。

これを行うには、ペアの合計を計算し、その合計の平方根が平方根のフロア値と等しいかどうかを確認します。 sqrt(Arr [i] + Arr [j])-floor(sqrt(Arr [i] + Arr [j])==0。

例を挙げて理解しましょう。

入力 − arr [] ={4,3,2,1,2,4} N =6

出力 −合計が完全な平方であるペアの数− 2

説明

Arr[1]+Arr[3]=4, sqrt(4)-floor(4)=0 4 is a perfect square.
Arr[2]+Arr[4]=4, sqrt(4)-floor(4)=0 4 is a perfect square.
Rest all pairs have sum 7,6,5,8 which are not perfect squares.

入力 − arr [] ={3,3,3,3,3} N =5

出力 −合計が完全な二乗であるペアの数− 0

説明 −すべてのペアのsum =6ですが、これは完全な正方形ではありません。

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

  • 乱数で初期化された整数配列Arr[]を使用します。

  • Arr[]の長さを格納する変数nを取ります。

  • 関数countPairs(int arr []、int n)は、入力としてその長さの配列を受け取り、完全な平方である合計を持つペアを返します。

  • ペアの要素ごとに2つのforループを使用して配列をトラバースします。

  • 0 <=i

  • arr [i]の合計を計算し、arr[j]は正です。

  • 合計の平方根をsqrt(sum)として計算します。

  • 次に、sqr-floor(sqr)==0かどうかを確認します。つまり、合計は完全な正方形です。真のインクリメントカウントの場合。

  • すべてのループの終わりに、カウントには、完全な二乗である合計を持つペアの総数が含まれます。

  • 結果としてカウントを返します。

#include <bits/stdc++.h>
#include <math.h>
using namespace std;
int countPairs(int arr[], int n){
   int count=0;
   int prod=0;
   for(int i=0;i<n-1;i++){
      for(int j=i+1;j<n;j++){
         prod=arr[i]*arr[j];
         if( ceil(log2(prod))==floor(log2(prod)) ){
            count++;
            //cout<<endl<<"a :"<<arr[i]<<" b :"<<arr[j]; //to print
         }
      }
   }  
   return count;
}
int main(){
   int arr[] = { 2, 5, 8, 16, 128 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout <<endl<<"Pairs whose product is power of 2:"<<countPairs(arr, n);
   return 0;
}

出力

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

Pairs whose product is power of 2:6

  1. C++でa^2 + b ^ 2 =c^2および1<=a <=b <=c <=nとなるようにトリプレット(a、b、c)の数を数えます

    整数nが与えられます。目標は、条件を満たすトリプレット(3つの数字のセット)を見つけることです- a 2 + b 2 =c 2 1 <=a <=b <=c <=n これを行うには、1 <=a<=nと1<=b<=nの値に対して2つのループを実行します。それに応じてcを計算し(c =sqrt(a2 + b2))、条件1と2の両方が満たされた場合はカウントをインクリメントします。 例を挙げて理解しましょう。 入力 − n =5 出力 −トリプレットの数− 1 説明 − for a=3, b=4 and c=5 both conditions are m

  2. C++でi<j<kおよびa[i]<a [j]<a[k]などの配列内のトリプレットの最大合計を求めます

    コンセプト サイズnの正の整数の特定の配列に関して、トリプレット(a i )の最大合計を決定するタスク + a j + a k )0 <=i