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

C++で合計Sを持つ素数Pの後の素数


この問題では、合計S、素数P、およびNの3つの数が与えられます。私たちのタスクは、合計がSに等しいPより大きいN個の素数をすべて見つけることです。

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

Input: N = 2, P = 5, S = 18
Output: 7 11
Explanation: Prime numbers greater than 5 : 7 11 13
Sum = 7 + 11 = 18

この問題を解決するには、PとSの間のすべての素数を見つける必要があります。次に、合計がSになるN個の素数を見つけます。このためにバックトラッキングを使用します。

ソリューションの実装を示すプログラム

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<int> set;
vector<int> primeNo;
bool isPrimeNumber(int x) {
   int sqroot = sqrt(x);
   bool flag = true;
   if (x == 1)
      return false;
   for (int i = 2; i <= sqroot; i++)
      if (x % i == 0)
         return false;
   return true;
}
void printPrimes() {
   int length = set.size();
   for (int i=0; i<length; i++)
   cout<<set[i]<<"\t";
   cout<<endl;
}
void GeneratePrimeSum(int total, int N, int S, int index) {
   if (total == S && set.size() == N) {
      printPrimes();
      return;
   }
   if (total > S || index == primeNo.size())
   return;
   set.push_back(primeNo[index]);
   GeneratePrimeSum(total+primeNo[index], N, S, index+1);
   set.pop_back();
   GeneratePrimeSum(total, N, S, index+1);
}
void PrimesWithSum(int N, int S, int P) {
   for (int i = P+1; i <=S ; i++) {
      if (isPrimeNumber(i))
      primeNo.push_back(i);
   }
   if (primeNo.size() < N)
   return;
   GeneratePrimeSum(0, N, S, 0);
}
int main() {
   int S = 23, N = 3, P = 3;
   cout<<N<<" Prime numbers greater than "<<P<<" with sum = "<<S<<" are :\n";
   PrimesWithSum(N, S, P);
   return 0;
}

出力

3 Prime numbers greater than 3 with sum = 23 are :
5   7   11

  1. C++の配列内のすべての素数の積

    いくつかの要素を持つ整数配列arr[]が与えられた場合、タスクはその数のすべての素数の積を見つけることです。 素数は、1で割った数、またはその数自体です。または、素数は、1とその数自体を除いて他の数で割り切れない数です。 1、2、3、5、7、11など 与えられた配列の解を見つける必要があります- 入力 −arr [] ={11、20、31、4、5、6、70} 出力 − 1705 説明 −配列の素数は− 11、31、5であり、それらの積は1705 入力 − arr [] ={1、2、3、4、5、6、7} 出力 − 210 説明 −配列の素数は− 1、2、3、5、7

  2. C++でのK否定後の配列合計を最大化する

    問題の説明 サイズnと数kの配列が与えられます。配列をk回変更する必要があります。 配列の変更とは、各操作で、配列要素arr [i]を否定することで置き換えることができることを意味します。つまり、arr [i] =-arr[i]です。タスクは、k回の操作の後、配列の合計が最大になるようにこの操作を実行することです。 input arr [] ={7、-3、5、4、-1}の場合、最大合計は20になります。 最初に-3を否定します。これで、配列は{7、3、5、4、-1}になります 負の-1。これで、配列は{7、3、5、4、1}になります アルゴリズム 1. Replace the min