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

C++で指定された数に等しいGCDを持つ自然数のペアを数えます


「start」、「end」、「number」の3つの入力変数を指定しました。目標は、GCD値が「数値」に等しい開始と終了の間の数値のペアを見つけることです。たとえば、GCD(A、B)=numberであり、A、Bの両方が[start、end]の範囲内にあります。

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

入力 − start =5 end =20 number =8

出力 −与えられた数に等しいGCDを持つ自然数のペアの数は− 3

説明 − GCDが8になるような5から20のペアは、−(8,8)、(8,16)、(16,8)

入力 − start =5 end =20 number =7

出力 −与えられた数に等しいGCDを持つ自然数のペアの数は− 2

説明 − GCDが7になるような20〜30のペアは−(21,28)、(28,21)

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

2つのアプローチを使用します。 i=startからi<=endまでのforループと、j=startからj<=endまでの内部ループを使用してトラバースする最初の単純なアプローチ。各pair(i、j)について、GCD(i、j)==numberかどうかを確認します。真のインクリメントカウントの場合。

  • 変数start、end、numberを整数とします。

  • 関数GCD(int a、int b)は再帰的であり、渡された引数a、bのGCDを返します。

  • bがゼロ以外の場合は、GCD(b、a%b)として再帰的に呼び出し、それ以外の場合はaを返します。

  • 関数GCD_pairs(int start、int end、int number)は、境界変数start、end、およびvariable numberを受け取り、gcd=numberを持つstartとendの間のペアを返します。

  • 初期カウントを0とします。

  • ペアのメンバーごとに2つのforループを使用します。 i=startからi<=endまでの外側のループと、j=startからj<=endまでの内側のループ。

  • ペア(i、j)、GCD(i、j)==数値かどうかを確認します。 trueの場合、カウントをインクリメントします。

  • 最後に、gcd=numberのペアの総数を取得します。

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

効率的なアプローチ

このアプローチでは、startとendの値を更新します。 pair(i、j)がgcd =numberを持つためには、両方のi、jが‘numberで割り切れる必要があります。 「番号」を完全に分割する最大(終了-開始)/番号番号があります。 「数値」で割り切れる開始と終了の間の数値を取得するには、開始=(開始+数値-1)/数値から終了=終了/数値までトラバースします。したがって、gcd(i、j)==1の場合、そのような数値ごとに、そのようなペア(i、j)のカウントをインクリメントします。

  • 変数start、end、numberを整数とします。

  • 更新開始=(開始+番号-1)/番号。そしてend=end/number。

  • 関数GCD(int a、int b)は再帰的であり、渡された引数a、bのGCDを返します。

  • bがゼロ以外の場合は、GCD(b、a%b)として再帰的に呼び出し、それ以外の場合はaを返します。

  • 関数GCD_pairs(int start、int end、int number)は、境界変数start、end、およびvariable numberを受け取り、gcd=numberを持つstartとendの間のペアを返します。

  • 初期カウントを0とします。

  • ペアのメンバーごとに2つのforループを使用します。 i=startからi<=endまでの外側のループと、j=startからj<=endまでの内側のループ。

  • ペア(i、j)、GCD(i、j)==1かどうかを確認します。 trueの場合、カウントをインクリメントします。

  • 最後に、gcd=numberのペアの総数を取得します。

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

例(素朴なアプローチ)

#include <bits/stdc++.h>
using namespace std;
int GCD(int a, int b){
   return b ? GCD(b, a % b) : a; }
int GCD_pairs(int start, int end, int number){
   int count = 0;
   for (int i = start; i <= end; i++){
      for (int j = start; j <= end; j++){
         if (GCD(i, j) == number){
            count++;
         }
      }
   }
   return count;
}
int main(){
   int start = 10, end = 30, number = 10;
   cout<<"Count of pairs of natural numbers with GCD equal to given number are: "<<GCD_pairs(start, end, number) << endl;
   return 0;
}

出力

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

Count of pairs of natural numbers with GCD equal to given number are: 7

例(効率的なアプローチ)

#include <bits/stdc++.h>
using namespace std;
int GCD(int a, int b){
   return b ? GCD(b, a % b) : a;
}
int GCD_pairs(int start, int end, int number){
   int count = 0;
   for (int i = start; i <= end; i++){
      for (int j = start; j <= end; j++){
         if (GCD(i, j) == 1){
            count++;
         }
      }
   }
   return count;
}
int main(){
   int start = 10, end = 30, number = 10;
   start = (start + number - 1) / number;
   end = end / number;
   cout<<"Count of pairs of natural numbers with GCD equal to given number are: "<<GCD_pairs(start, end, number) << endl;
return 0;
}

出力

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

Count of pairs of natural numbers with GCD equal to given number are: 7

  1. C++でkに等しい差を持つすべての異なるペアをカウントします

    このチュートリアルでは、差がkに等しい個別のペアを見つけるプログラムについて説明します。 このために、整数配列と値kが提供されます。私たちのタスクは、差がkであるすべての個別のペアをカウントすることです。 例 #include<iostream> using namespace std; int count_diffK(int arr[], int n, int k) {    int count = 0;    //picking elements one by one    for (int i = 0; i <

  2. C++で指定されたインデックスを持つNフィボナッチ数のGCDを検索します

    ここでは、指定されたインデックスを持つn個のフィボナッチ項のGCDを見つける必要があります。したがって、最初に最大インデックスを取得し、フィボナッチ項を生成する必要があります。いくつかのフィボナッチ項は次のようになります:0、1、1、2、3、5、8、13、21、34、…..インデックスは開始です0から。したがって、0 thの要素 インデックスは0です。インデックス{2、3、4、5}でフィボナッチ項のgcdを見つける必要がある場合、項は{1、2、3、4}であるため、これらの数値のGCDは1です。 このタスクを実行するために、1つの興味深いアプローチを使用します。 GCD(Fibo(i)、Fi