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

範囲内の桁数


0から9までの整数dがあるとすると、下限と上限としてそれぞれ下限と上限の2つの正の整数もあります。下限と上限を含む、下限と上限の間のすべての整数でdが数字として出現する回数を見つける必要があります。

したがって、入力がd =1、low =1、high =13の場合、桁d =1は1,10,11,12,13のように6回発生するため、出力は6になります。

これを解決するには、次の手順に従います-

関数zero()を定義します。これにはnが必要です。

  • ret:=0、x:=0

  • nが0と同じ場合、-

    • 1を返す

  • 初期化m:=1の場合、m <=nの場合、更新m:=m * 10、do −

    • a:=n / m

    • b:=n mod m

    • z:=mod 10

    • mの桁数がnの桁数と同じである場合、-

      • ループから出てきます

    • z> xの場合、-

      • ret:=ret +((a / 10)+ 1)

    • それ以外の場合、zがxと同じである場合、

      • ret:=ret +((a / 10)* m +(b + 1))

    • それ以外の場合

      • ret:=ret +(a / 10)

  • retを返す

  • 関数f()を定義します。これには、x、n、

    が必要です。
  • ret:=0

  • 初期化m:=1の場合、m <=nの場合、更新m:=m * 10、do −

    • a:=n / m

    • b:=n mod m

    • z:=mod 10

    • z> xの場合、

      • ret:=ret +((a / 10)+ 1)

    • それ以外の場合、zがxと同じである場合、-

      • ret:=ret +((a / 10)* m +(b + 1))

    • それ以外の場合

      • ret:=ret +(a / 10)

    • xが0と同じ場合、-

      • ret:=ret --m

  • retを返す

  • メインの方法から次のようにします

  • retを返す

  • f(d、high-f(d、low-1))を返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int digitCount(int x){
      int ret = 0;
      while (x) {
         ret++;
         x /= 10;
      }
      return ret;
   }
   int zero(int n){
      int ret = 0;
      int x = 0;
      if (n == 0)
      return 1;
      for (int m = 1; m <= n; m *= 10) {
         int a = n / m;
         int b = n % m;
         int z = a % 10;
         if (digitCount(m) == digitCount(n))
         break;
         if (z > x) {
            ret += ((a / 10) + 1) * m;
         } 
         else if (z == x) {
            ret += (a / 10) * m + (b + 1);
         } else {
            ret += (a / 10) * m;
         }
         cout << ret << endl;
      }
      return ret;
   }
   int f(int x, int n){
      int ret = 0;
      for (int m = 1; m <= n; m *= 10) {
         int a = n / m;
         int b = n % m;
         int z = a % 10;
         if (z > x) {
            ret += ((a / 10) + 1) * m;
         }
         else if (z == x) {
            ret += (a / 10) * m + (b + 1);
         } else {
            ret += (a / 10) * m;
         }
         if (x == 0) {
            ret -= m;
         }
      }
      return ret;
   }
   int digitsCount(int d, int low, int high){
      return f(d, high) - f(d, low - 1);
   }
};
main(){
   Solution ob;
   cout << (ob.digitsCount(1,1,13));
}

入力

1,1,13

出力

6

  1. Pythonは範囲内のセットビットをカウントしますか?

    2進数に変換されたときに指定された正の数には、いくつかのセットビットがあります。 2進数のセットビットは1で表されます。この記事では、2進数に変換された後、特定の数値のセットビットの数を取得する方法を説明します。 ビンの使用とスライス 次の例では、数値を取得し、bin関数を適用してバイナリ値を取得します。次に、それをスライスして2進数に追加されたプレフィックスを削除し、範囲関数を適用してセットビットの数を取得します。 例 def SetBits_cnt(n, l, r):    bin_val = bin(n)    # Remove '0b

  2. 範囲内の未設定ビットをカウントするPythonプログラム。

    正の数とビットの範囲が与えられます。私たちのタスクは、範囲内の未設定ビットをカウントすることです。 Input : n = 50, starting address = 2, ending address = 5 Output : 2 2〜5の範囲に「2」の未設定ビットがあります。 アルゴリズム Step 1 : convert n into its binary using bin(). Step 2 : remove first two characters. Step 3 : reverse string. Step 4 : count all unset bit 0 start