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

先頭ゼロを含まないN桁のB進数の個数を求める方法

本記事では、次のような問題を扱います。整数Nと基数Bが与えられたとき、先頭(最上位桁)が0ではないN桁のB進数が何通りあるかを数えます。例えば、N=2、B=2の場合、2桁の2進数は「00」「01」「10」「11」の4通り存在しますが、このうち先頭が0でない有効な数は「10」と「11」の2つだけです。

考え方

基数がBである場合、使用できる数字は0からB−1までのB種類です。したがって、先頭ゼロを含む場合、N桁の数は全部でBN通り生成できます。そのうち、先頭の桁が0になるものは、残りのN−1桁だけで決まるためBN−1通りあります。よって、先頭ゼロを含まないN桁のB進数の総数は、次の式で求められます。

BN − BN−1

アルゴリズム

countNDigitNum(N, B)

Begin
   total := BN
   with_zero := BN-1
   return total - with_zero
End

C++による実装例

#include <iostream>
#include <cmath>
using namespace std;

int countNDigitNum(int N, int B) {
   int total = pow(B, N);
   int with_zero = pow(B, N - 1);
   return total - with_zero;
}

int main() {
   int N = 5;
   int B = 8;
   cout << "Number of values: " << countNDigitNum(N, B);
}

実行結果

Number of values: 28672

N=5、B=8の場合、85 = 32768、84 = 4096 となるため、32768 − 4096 = 28672 という結果が得られます。このように、べき乗の差を計算するだけで、先頭ゼロを含まないN桁のB進数の個数を簡単に求められます。

  1. 文字列から1と2以外のすべての数字を削除するJavaプログラム

    正規表現「(?<!\\d)数字(?!\\d)」は、指定された特定の数字に一致します。このパターンでは、後読みアサーション((?<!\\d))と先読みアサーション((?!\\d))を組み合わせており、対象の数字の直前・直後に別の数字が存在しない場合、つまり「単独の数字」であるときにのみマッチします。replaceAll()メソッドは、第1引数に正規表現パターン、第2引数に置換後の文字列を受け取るメソッドです。パターンに一致したすべての箇所が、指定された文字列に置き換えられます。したがって、文字列から1と2を除くすべての数字を削除するには、以下の手順で処理を行います。まず、正規表現を使

  2. 【Python入門】3つの数字を入力して全ての組み合わせ(順列)を表示する方法

    ユーザーから入力を受け取った3つの数字について、すべての可能な組み合わせ(順列)を表示したい場合には、ネストされたループ(多重ループ)を使用します。以下に具体的な実装例を示します。サンプルコードfirst_num = int(input(最初の数字を入力してください...)) second_num = int(input(2番目の数字を入力してください...)) third_num = int(input(3番目の数字を入力してください...)) my_list = [] print(最初の数字は) print(first_num) print(2番目の数字は) print(second_nu