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

nCrがC++で指定された素数で割り切れるかどうかを調べます


3つの変数N、R、およびPがあるとします。NとRは、 N を取得するために使用されます。 C R Pは素数です。 N かどうかを確認する必要があります C R はPで割り切れる。いくつかの数N=7、R =2、P =3があるとすると、 7 C 2 =21、これは3で割り切れるので、出力はtrueになります。

N C R =N! /(R!*(N – R)!)。ルジャンドルの公式を使用して、任意のN!、R!を分割するPの最大の累乗にします。および(N – R)! NCRをPで除算できるようにするには、条件はNです。> R! +(N-R)!

#include <iostream>
using namespace std;
int getPower(int n, int p) {
   int pow = 0;
   while (n) {
      n /= p;
      pow += n;
   }
   return pow;
}
bool isDivisibleByP(int n, int r, int p) {
   // Find the highest powers of p
   // that divide n!, r! and (n - r)!
   int x1 = getPower(n, p);
   int x2 = getPower(r, p);
   int x3 = getPower(n - r, p);
   if (x1 > x2 + x3)
   return true;
   return false;
}
int main() {
   int n = 7, r = 2, p = 7;
   if (isDivisibleByP(n, r, p))
      cout << "nCr is divisible by P";
   else
      cout << "nCr is not divisible by P";
}

出力

nCr is divisible by P

  1. C++でnに最も近くmで割り切れる数を見つけます

    2つの整数nとmがあるとします。 nに最も近い数を見つけて、mで割る必要があります。そのような数値が複数ある場合は、絶対値が最大の数値を表示してください。 nがmで完全に割り切れる場合は、nを返します。したがって、n =13、m =4の場合、出力は12になります。 これを解決するには、次の手順に従います- q:=n / m、n1:=m*qとします 0の場合、n2:=m *(q + 1)、それ以外の場合、n2:=m *(q-1) if | n – n1 | <| n – n2 |、次にn1を返し、それ以外の場合はn2 例 #include<iostream> #incl

  2. C ++で指定された文字列内の「1(0+)1」のすべてのパターンを検索します

    文字列に1(0+)1のようなパターンがあるとします。ここで、(0+)は、空でない連続した1の出現を示します。すべてのパターンを見つける必要があります。パターンは重複する可能性があります。文字列は必ずしもバイナリ文字列である必要はありません。数字と小文字のみを保持できます。文字列が1101001のようなものであるとすると、そのようなパターンが2つあります。 101と1001。 この問題を解決するために、次の手順に従います- 文字列内のすべての文字cを繰り返し処理します cが1の場合、要素が0になるまで繰り返します 0のストリームが終了すると、次の文字が1かどうかを確認します