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

mで割り切れ、C++の偶数の位置に数字dがある範囲内の数値の数


整数の範囲、除数として使用される変数m、および桁'd'が偶数の位置にあるかどうかを確認するために使用される変数dが与えられ、タスクは、これらの数値の数を計算することです。変数mで割り切れ、偶数の位置に数字dがある範囲。

入力- int start =20、end =50、d =8、m =4

出力- mで割り切れ、偶数の位置に数字dがある範囲の数値の数は次のとおりです。2

説明- 範囲は20から50までです。したがって、数字d、つまり8の可能な数値は28、38、および48であり、偶数の位置、つまり2に8があり、数値24および48はm、つまり4で割り切れるので、カウントは2です。

入力- int start =10、end =100、d =6、m =2

出力- mで割り切れ、偶数の位置に数字dがある範囲の数値の数は次のとおりです。8

説明- 範囲は10から100までです。したがって、数字dの可能な数字、つまり6、16、26、36、46、56、66、76、86、および96は、6と66の数字を除いて、偶数の位置に6があります。奇数の位置なので、これは含めません。次に、リストから2で割り切れる数値を確認します。これにより、16、26、36、46、56、76、86、および96のすべての数値が2で割り切れるので、カウントされます。は8です。

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

  • 変数の開始から変数の終了までの整数の範囲を作成し、変数dとmを宣言して、値を入力します。さらに処理するためにデータを関数に渡します。
  • ベクトル型の変数を作成します。たとえばvecです。
  • 変数内の値である値が開始するまでループを開始します。ここで、while内で、値をval%10としてベクトルにプッシュし、valをval/10として設定します。
  • vec.begin()とvec.end()を引数として渡して、STLの逆関数を呼び出します。
  • memsetを使用して、配列の値を-1に設定します。
  • set_total(0、0、0、vec)を返します。これは、位置dが偶数で、mで割り切れるかどうかをチェックする関数です。
  • set_totalfunction-:
      の内部
    • IFの場所がベクトルのサイズと等しいことを確認してから、IF temp =0を確認してから、1を返すか0を返します。
    • arr [place] [temp] [val]が-1に等しくないかどうかを確認してから、arr [place][temp][val]の値を返します。
    • IF place%2 =1をチェックし、次にIF val =0をチェックし、次にIFdがvec[place]より大きいことをチェックしてから0を返します
    • 変数temp_2を宣言し、0に設定します。
    • IFdがvec[place]未満であることを確認してから、temp_2を1に設定します。
    • 変数temp_3を宣言し、set_total()を再帰的に呼び出して、arr [place] [temp] [val] =temp_3
    • を返します。
    • 結果を格納するための変数カウントを宣言します。
    • 変数set_limitを宣言し、valが1に等しい場合は9に設定します。ELSEはvec[place]で設定します。
    • set_limitまでiから0までループFORを開始し、iがdに等しいかどうかを確認してから続行します
    • 変数をtemp_2として宣言し、valに設定します
    • ifiがvec[place]未満であることを確認してから、temp_2を1に設定します
    • 関数set_totalの再帰呼び出しでカウントを設定します
    • return arr [place] [temp] [val]=count。

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

int arr[20][20][2];
int d, m;

int set_total(int place, int temp, int val, vector < int > vec) {
   if (place == vec.size()) {
      if (temp == 0) {
         return 1;
      }
      return 0;
   }
   if (arr[place][temp][val] != -1) {
      return arr[place][temp][val];
   }
   if (place % 2) {
      if (val == 0) {
         if (d > vec[place]) {
            return 0;
         }
      }
      int temp_2 = val;
      if (d < vec[place]) {
         temp_2 = 1;
      }
      int temp_3 = set_total(place + 1, (10 * temp + d) % m, temp_2, vec);
      return arr[place][temp][val] = temp_3;
   }
   int count = 0;
   int set_limit = (val ? 9 : vec[place]);
   for (int i = 0; i <= set_limit; i++) {
      if (i == d) {
         continue;
      }
      int temp_2 = val;
      if (i < vec[place]) {
         temp_2 = 1;
      }
      count += set_total(place + 1, (10 * temp + i) % m, temp_2, vec);
   }
   return arr[place][temp][val] = count;
}

int divisible(int val) {
   vector < int > vec;
   while (val) {
      vec.push_back(val % 10);
      val = val / 10;
   }
   reverse(vec.begin(), vec.end());
   memset(arr, -1, sizeof(arr));
   return set_total(0, 0, 0, vec);
}
int main() {
   int start = 20, end = 50;
   d = 8, m = 4;
   int count = divisible(end) - divisible(start);
   cout << "Count of Numbers in a Range divisible by m and having digit d in even positions are: " << count;
   return 0;
}

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

出力

Count of Numbers in a Range divisible by m and having digit d in even positions are: 2

  1. C++で指定された範囲の階乗数をカウントします

    変数が保持する整数値から始まり、たとえば開始から変数の終了までの範囲が与えられます。タスクは、指定された範囲で使用可能な階乗数の総数をカウントすることです。 階乗数とは 数値の階乗は、数値の桁を1で除算しながら、数値の桁を乗算することによって計算されます。これは、記号「!」で示されます。つまり、0!、1!、2!、3!、5!、...です。 、等。 0の階乗!と1!常に1です。 I.e. factorial of 2 = 2 * (2-1) = 2 * 1 = 2       factorial of 3 = 3 * (3-1) * (2-1) = 3 * 2 *

  2. C++での数値範囲のビットごとのAND

    範囲[m、n]があり、0 <=m <=n<=2147483647であるとします。この範囲内のすべての数値のビットごとのANDを見つける必要があります。したがって、範囲が[5、7]の場合、結果は4になります。 これを解決するには、次の手順に従います- i:=0 mがnでない場合、 m:=m / 2、n:=n / 2、iを1増やします 左にi回シフトした後、mを返します。 例(C ++) 理解を深めるために、次の実装を見てみましょう- #include <bits/stdc++.h> using namespace std; class Soluti