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

C ++では、0を数字として、最大の「d」桁を含む正の整数をカウントします


桁数を表す数dが与えられます。目標は、0を桁とし、最大d桁の正の整数の数を見つけることです。少なくとも1つの0を含むすべての1桁、2桁、3桁….d桁の正の数を数えます。

最初に、少なくとも1つの0を持つd桁の数の数を見つけます。d=3としましょう。少なくとも1つの0で3桁の数字を作成するには、次の方法があります-

C ++では、0を数字として、最大の「d」桁を含む正の整数をカウントします

Here d1 can have 1 to 9 : 9 ways
d2 can have 0-9 : 10 ways
d3 can have 0-9 : 10 ways
Total numbers possible: 9 x 10 x 10 = 9 x 102
For d digits, count of numbers: 9 x 10d-1
For d digits, numbers without any 0 are : 9d
Total numbers having d digits with at least one 0 = 9 x 10d-1 - 9d = 9 x ( 10d-1 - 9d-1 )

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

入力 − d =4

出力 − 0を桁とし、最大の「d」桁を含む正の整数の数は− 2619

説明 −少なくとも1つの0を含むx桁の数字−

1 digit numbers : 0
2 digit numbers : 9
3 digit numbers : 171
4 digit numbers: 2439
Total= 9+171+2439 = 2619

入力 − d =1

出力 − 0を桁とし、最大の「d」桁を含む正の整数の数は− 0

説明 −1から9までの数字は数字として0を持ちません。

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

2つのアプローチを使用します。 forループを使用した最初の素朴なアプローチ。 1桁からd桁までのトラバースを開始し、上記の式を使用して数値を計算します。カウントに戻り値を追加します。

  • 整数dを数字とします。

  • 関数total_count(int d))は、桁数dを取り、少なくとも1つの0を持つd桁の数値のカウントを返します。

  • temp =9 *(pow(10、d-1)--pow(9、d-1));

    のような数値を計算します。
  • 戻り温度。

  • 関数maximum_d(int d)は、最大桁数dを取り、少なくとも1つの0を持つd桁までの数値のカウントを返します。

  • 1桁の数字から始まり、2、というようにdまでループを使用してトラバースします。

  • 各dについて、total_count(i)として数値を計算します。これを追加してカウントします。

  • 最後に、合計数を取得します。

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

効率的なアプローチ

このアプローチでは、上記の計算で形成されたG.Pを観察して、カウントを計算します。

Solution is 9 x (10d-1 - 9d-1)
= 9 x (10d - 1)- 9 x (9d-1)
= 9 x (10i - 1) - 9 x (9i - 1) ( 1<=i<=d )
= g.p 1 - g.p 2
= 9x(10d-1)/(10-1) - 9x(9d-1)/(9-1)
= (10d-1)- (9/8)*(9d-1)
  • dを最大桁数とします。

  • 関数maximum_d(int d)は、最大桁数dを取り、少なくとも1つの0を持つd桁までの数値のカウントを返します。

  • 上記の式を使用して、temp_1を9 *((pow(10、d)-1)/ 9)として計算します。

  • temp_2を9*((pow(9、d)-1)/ 8)として計算します。

  • count=temp_1--temp_2を設定します。

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

例(素朴なアプローチ)

#include<bits/stdc++.h>
using namespace std;
int total_count(int d){
   int temp = 9*(pow(10,d-1) - pow(9,d-1));
   return temp;
}
int maximum_d(int d){
   int count = 0;
   for (int i=1; i<=d; i++){
      count = count + total_count(i);
   }
   return count;
}
int main(){
   int d = 5;
   cout<<"Count of positive integers with 0 as a digit and maximum 'd' digits are: "<<maximum_d(d) << endl;
   return 0;
}

出力

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

Count of positive integers with 0 as a digit and maximum 'd' digits are: 33570

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

#include<bits/stdc++.h>
using namespace std;
int maximum_d(int d){
   int temp_1 = 9*((pow(10,d)-1)/9);
   int temp_2 = 9*((pow(9,d)-1)/8);
   int count = temp_1 - temp_2;
   return count;
}
int main(){
   int d = 4;
   cout<<"Count of positive integers with 0 as a digit and maximum 'd' digits are: "<<maximum_d(d) << endl;
   return 0;
}

出力

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

Count of positive integers with 0 as a digit and maximum 'd' digits are: 2619

  1. Cで割り切れる最大の正の整数であり、C ++では[A、B]の範囲にあります

    ここで、1つの興味深い問題が発生します。 3つの整数A、B、およびCがあると考えてみましょう。XmodC =0であり、Xが[A、B]の範囲にないように、1つの最小整数Xを見つける必要があります。 A、B、Cの値がそれぞれ5、10、4の場合、Xの値は4になります。解を得るには、次の手順に従う必要があります- 手順- Cが[A、B]の範囲にない場合は、結果としてCを返します それ以外の場合は、Bより大きいCの最初の倍数を取得し、その値を返します 例 #include <iostream> using namespace std; int findMinMumber(

  2. C++で指定された製品のN個の整数の最大GCD

    2つの整数NとPがあるとします。PはN個の未知の整数の積です。これらの整数の可能な最大GCDを見つける必要があります。 N =3、P =24とすると、異なるグループは{1、1、24}、{1、2、12}、{1、3、8}、{1、4、6}、{2 、2、6}、{2、3、4}。 GCDは1、1、1、1、2、1です。したがって、ここで答えは2です。 Pのすべての素因数を見つけて、ハッシュマップに保存します。素因数がすべての整数で共通である場合、N個の整数の最大公約数は最大GCDになります。したがって、P =p 1の場合 k1 * p 2 k2 *…*p n kn 。ここで、piは素因