整数の桁を扱うライブラリです.ソースはこちら

使用法

  digit_util du;      // base == 10
  digit_util du1(3);  // base == 3
  digit_util du2(16); // base == 16
  
  du.pow(3)          // 1000
  du.pow(18)         // 1000000000000000000
  du.pow_size()      // 19, meaning du.pow(i) is valid for i from 0 to 18
  du.width(5678)     // 4, meaning 5678 has 4 digits
  du.width(0)        // Error.   width(n) is defined only for n > 0.
  du.nd_min(3)       // 100, the least number whose width is 3.
  su.nd_max(4)       // 9999, the maximum number whose width is 4.
  du.floor(1234)     // 1000, the largest power of 10 that does not exceed 1234
  du.ceil(1234)      // 10000, the smallest power of 10 that does not fall below 1234
  du.d_at(1234, 0)   // 4,  du.d_at(1234, 1) == 3,  du.d_at(1234, 2) == 2, du.d_at(1234, 3) == 1
  du.v_at(1234, 0)   // 4,  du.v_at(1234, 1) == 30, du.d_at(1234, 2) == 200, du.d_at(1234, 3) == 1000
  du.to_vector(1234) // vector<ll>{1, 2, 3, 4}
  du.to_string(1234) // "1234"
  du.from_vector(vector<ll>{1, 2, 3, 4}) // 1234
  du.from_string("1234")                 // 1234

使用準備

digit_util 構造体のオブジェクトを作成する.ここでは du とする. 作成時に base を指定する.十進法なら 10,16進法なら 16 という具合. base が 10 のときには省略できる.以下,base は $b$ と記述する.

  digit_util du;      // base == 10
  digit_util du1(3);  // base == 3
  digit_util du2(16); // base == 16

累乗

$b$ の $k$ 乗は,pow(k) で得られる.

  du.pow(3)          // 1000
  du.pow(18)         // 1000000000000000000

実装上,pow の値はベクトルに格納されているが,その長さは pow_size() で取得できる. つまり,du.pow(k) は,0 <= k < du.pow_size() なる k に対して有効である.

  du.pow_size()      // 19, meaning du.pow(i) is valid for i from 0 to 18

桁数

正の整数 $x$ の桁数は,width(x) で取得できる. たとえば,5678 は 4 桁の数だから,du.width(5678) の値は 4 である.

正の数以外を与えるとエラーになる.

  du.width(5678)     // 4, meaning 5678 has 4 digits
  du.width(0)        // Error.   width(n) is defined only for n > 0.

桁の範囲

$n$ 桁の整数の最小値と最大値は nd_min(n)nd_max(n) で取得できる.

  du.nd_min(3)       // 100, the least number whose width is 3.
  su.nd_max(4)       // 9999, the maximum number whose width is 4.

正の整数 $x$ に対し,$b^k$ の形の数で $x$ 以下の 最大のものと $x$ 以上の 最小のものは, floor(x)ceil(x) で取得できる. $b = 2$ のときは,std::bit_floorstd::bit_ceil と同等である.

  du.floor(1234)     // 1000, the largest power of 10 that does not exceed 1234
  du.ceil(1234)      // 10000, the smallest power of 10 that does not fall below 1234

指定桁の数

正の整数 $x$ の $k$ 桁めの数は,d_at(x, k) で取得できる.ここで,$k$ は右から順に 0, 1, 2, … と数える. つまり,$k$ を指定すると 「$b^k$ の位」の数が取得できる. 一方で,v_at(x, k) は,$k$ 桁めの数が表す値である. つまり,du.v_at(x, k) == du.d_at(x, k) * du.pow(k) の関係にある.

  du.d_at(1234, 0) == 4;
  du.d_at(1234, 1) == 3;
  du.d_at(1234, 2) == 2;
  du.d_at(1234, 3) == 1;
  du.v_at(1234, 0) ==    4;
  du.v_at(1234, 1) ==   30;
  du.d_at(1234, 2) ==  200;
  du.d_at(1234, 3) == 1000;

ベクトルや文字列との変換

正の整数 $x$ と,桁ごとのベクトル $v$ との変換は,to_vector(x), from_vector(v) で, 正の整数 $x$ と,文字列 $s$ との変換は,to_string(x), from_string(s) で実現できる.

  du.to_vector(1234) // vector<ll>{1, 2, 3, 4}
  du.to_string(1234) // "1234"
  du.from_vector(vector<ll>{1, 2, 3, 4}) // 1234
  du.from_string("1234")                 // 1234

keywords: digit util