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

Nの基数B表現で後続ゼロの数を見つけます! C++を使用する


この記事では、階乗のベースB表現で特定の数Nの後続ゼロを見つける問題を理解します。例

Input : N = 7 Base = 2
Output : 4
Explanation : fact(7) = 5040 in base10 and 1001110110000 in base16 having 4 trailing zero.

Input : N = 11 Base = 5
Output : 2
Explanation : fact(11) = 39916800 in base10 and 40204314200 in base16 having 2 trailing zeroes.

まず、10進数を1つの基数から別の基数に変換するプロセスを要約します。 (5040)10を(?)2に変換する例を見てみましょう

Nの基数B表現で後続ゼロの数を見つけます! C++を使用する

つまり、数値を2で除算し、数値をそれ以上除算できなくなるまで余りを保持します。結果は逆の順序で残りになります。

その結果、4つの後続ゼロがあり、2で数値を余り0で割ったときに得られるこの後続ゼロ。

5040の素因数分解=24* 56711 * 3381 * 181は、2が5040を4回除算し、余り0が後続ゼロに等しいことを意味します。このようにして、後続ゼロの数を計算できます。

解決策を見つけるためのアプローチ

末尾のゼロの数を見つける方法については、上記で説明しました。階乗NでBの最大の累乗を見つける必要があります。たとえば、ベースB =14の場合、ベース14の14は10として表されます。つまり、(14)10 =(10)14です。ルジャンドルの公式としても知られています。

上記のアプローチのC++コード

これが、与えられた問題を解決するための入力として使用できるC++構文です-

#include <bits/stdc++.h>
using namespace std;

vector < pair < int, int >> primeFactorsofBase(int Base) {
   // declaring factors to store prime factors
   // along with occurence in factorisation of Base .
   vector < pair < int, int >>factors;

   for (int i = 2; Base != 1; i++) {
      if (Base % i == 0) {
         int count = 0;
         while (Base % i == 0){
            Base = Base / i;
            count++;
         }

         factors.push_back (make_pair (i, count));
      }
   }
   return factors;
}


int main () {
   int N = 11, Base = 5;
   // finding the largest power of Base that divides factorial N.
   vector < pair < int, int >>prime_factors;
   // finding prime factors by primeFactorsofBase() function.
   prime_factors = primeFactorsofBase(Base);

   int result = INT_MAX;
   for (int i = 0; i < prime_factors.size (); i++) {
      // calculating minimum power.
      int count = 0;
      int r = prime_factors[i].first;
      while (r <= N){
         count += (N / r);
         r = r * prime_factors[i].first;
      }
      result = min (result, count / prime_factors[i].second);
   }
   //printing trailing zeroes stored in result.
   cout << "Number of trailing zeroes: " <<result;
   return 0;
}

出力

Number of trailing zeroes: 2

上記のコードの説明

  • ベクトルを使用してBaseの最大の累乗を見つけます。
  • 最大のべき乗を計算するには、すべての素因数を格納するベクトルを使用して素因数を計算します。
  • 次に、Baseのすべての素因数の最小パワーを計算します。
  • 最後に、結果を印刷します。

結論

この記事では、階乗NのベースB表現で後続ゼロの数を見つける問題を解決します。これは、ルジャンドルの公式を使用して解決します。同じ問題を解決するためにC++コードも記述します。このコードは、Java、C、Pythonなどの他の言語で記述できます。この記事がお役に立てば幸いです。


  1. C++を使用して停止ステーションの数を見つける

    ポイントXとYの間にn個の中間駅があります。2つの駅が隣接しないように、s駅に停車するように列車を配置できるさまざまな方法の数を数えます。そのため、この記事では、停車駅の数を見つけるためのあらゆる可能なアプローチについて説明します。問題を見ると、sの駅数で列車を止めることができる組み合わせを見つける必要があることがわかります。 問題を解決するためのアプローチ 中間駅が8つあり、3つの中間駅で電車を止める方法を見つける必要がある例を見てみましょう。 n = 8, s = 3 (n-s)、つまり電車が止まらない駅が5つ残っています 電車が止まらないA、B、C、D、Eの5つの駅があります

  2. C++を使用してセットの反射関係の数を見つける

    この記事では、集合上の反射関係の数を見つけるためのアプローチについて説明します。この問題では、数nが与えられ、n個の自然数のセットで、反射関係の数を決定する必要があります。 反射関係 −集合Aの関係は、(a、a)が集合Aに属するすべてのaがRに属する場合、反射的と呼ばれます。たとえば、- Input : x = 1 Output : 1 Explanation : set = { 1 }, reflexive relations on A * A : { { 1 } } Input : x = 2 Output : 4 Explanation : set = { 1,2 }, reflex