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

素数の数<=Nで、それまでの素数の数との差は、C++では>=Kです。


2つの整数NとKが与えられた場合、目標は、以下の条件に従うような数の数を見つけることです-

  • 番号<=N

  • |数カウント|> =Kここで、countは、Number以下の素数の数です。

入力

N = 5, K = 2

出力

Count of numbers < = N whose difference with the count of primes upto them is > = K are: 2

説明

The numbers that follow the conditions are:
5 ( 5−2>=2 ) and 4 ( 4−2>=2 )

入力

N = 10, K = 6

出力

Count of numbers < = N whose difference with the count of primes upto them
is > = K are: 1

説明

The numbers that follow the conditions are:
10 ( 10−4>=6 )

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

このアプローチでは、二分探索を使用して計算を減らします。numまでの素数の数がcount1であり、数num + 1の場合、この数はcount2です。次に、差num + 1-count2>=num-count1。したがって、numが有効な場合、num + 1も有効になります。最初に見つかった数値について、条件に従う二分探索を使用して「num」と言うと、「num」+1も同じ条件に従います。このようにして、numからNまでのすべての数値がカウントされます。

  • 変数NとKを入力として受け取ります。

  • 配列arr[]は、iまでの素数の数を格納するために使用されます。インデックスiに格納されます。

  • 関数set_prime()は、素数の数を格納するために配列arr[]を更新します。

  • 配列check[i]は、iが素数の場合はtrueを格納し、それ以外の場合はfalseを格納します。

  • check [0] =check [1] =falseに設定します。これは、素数ではないためです。

  • インデックスi=2からi*i に設定します。

  • 次に、forループを使用してarr []をトラバースし、更新します。 arr [i] =arr[i-1]までのすべてのカウント。 arr [i]自体が素数の場合、そのカウントは1ずつ増加します。arr[i]++を設定します。

  • 関数total(int N、int K)は、NとKを取り、数の数<=Nを返します。その数とそれまでの素数の数との差は>=Kです。

  • set_prime()を呼び出します。

  • temp_1=1およびtemp_2=Nを取ります。初期カウントを0とします。

  • ここで二分探索を使用して、whileループでset =(temp_1 + temp_2)>> 1((first + last)/ 2)。

  • set-arr[set]が>=Kの場合、条件が満たされ、setおよびtemp_2=set-1でカウントを更新します。

  • それ以外の場合は、temp_1 =temp_1+1を設定します。

  • 最後に、最小有効数N-count+1または0としてカウントを設定します。

  • すべてのループの最後に、結果としてカウントが返されます。

#include <bits/stdc++.h>
using namespace std;
#define size 1000001
int arr[size];
void set_prime(){
   bool check[size];
   memset(check, 1, sizeof(check));
   check[0] = 0;
   check[1] = 0;
   for (int i = 2; i * i < size; i++){
      if(check[i] == 1){
         for (int j = i * 2; j < size; j += i){
            check[j] = 0;
         }
      }
   }
   for (int i = 1; i < size; i++){
      arr[i] = arr[i − 1];
      if(check[i] == 1){
         arr[i]++;
      }
   }
}
int total(int N, int K){
   set_prime();
   int temp_1 = 1;
   int temp_2 = N;
   int count = 0;
   while (temp_1 <= temp_2){
      int set = (temp_1 + temp_2) >> 1;
      if (set − arr[set] >= K){
         count = set;
         temp_2 = set − 1;
      } else {
         temp_1 = set + 1;
      }
   }
   count = (count ? N − count + 1 : 0);
   return count;
}
int main(){
   int N = 12, K = 5;
   cout<<"Count of numbers < = N whose difference with the count of primes upto them is > = K are: "<<total(N, K);
   return 0;
}

出力

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

Count of numbers < = N whose difference with the count of primes upto them is > = K are: 4

  1. C++で重みが完全な正方形であるノードを数えます

    ノードの重みを持つ二分木が与えられます。目標は、数が完全な平方になるような重みを持つノードの数を見つけることです。重みが36の場合は62であるため、このノードがカウントされます。 例 入力 値を入力した後に作成されるツリーを以下に示します- 出力 Count the nodes whose weight is a perfect square are: 4 説明 ツリーノードと各ノードに関連付けられた重みが与えられます。次に、ノードの桁が完全な平方であるかどうかを確認します。 ノード 重量 パーフェクトスクエア はい/いいえ 2 121 11 * 11 はい

  2. Xとの絶対差がC++で最大値を与えるノードを見つけます

    ツリーがあり、すべてのノードの重みと整数xがあるとします。 | weight [i]--x|となるようなノードiを見つける必要があります。最小です。グラフが以下のようで、x =15 出力は3になります。ノードごとに次のようになります ノード1、| 5 – 15 | =10 ノード2、| 10 – 15 | =5 ノード3、| 11 – 15 | =4 ノード4、| 8 – 15 | =7 ノード5、| 6 – 15 | =9 アイデアは単純です。ツリーでDFSを実行し、ノードの追跡を行います。ノードのxとの重み付き絶対差が最小値を示します 例 #include