C++で一意の桁(重複しない数字)を持つ数を数える方法
負でない整数 n が与えられたとき、0 以上 10n 未満の範囲に存在する「すべての桁が一意(重複なし)」である数 x の個数を求める問題を考えてみましょう。
例えば n = 2 の場合、0 から 100 未満までの数のうち、11、22、33、44、55、66、77、88、99 のように同じ数字が重複している数を除外した個数、つまり 91 が答えとなります。
解法のアプローチ
この問題は、桁ごとに選べる数字の組み合わせを順番にかけていくことで効率的に解くことができます。手順は以下の通りです。
n が 0 の場合は 1 を返します(0 のみが該当するため)。
n は最大でも 10 桁しか考慮できないため、n := min(10, n) とします。
n が 1 の場合は 10 を返します(0〜9 の一桁の数はすべて一意であるため)。
初期値として ans := 9、ret := 10 を設定します。最初の桁には 1〜9 の 9 通り、全体としては 0〜9 の 10 個が該当するためです。
i を 2 から n までループさせます。
ans := ans * (9 − i + 2) として、新しい桁で使える残りの数字の選択肢を掛け合わせます。
ret := ret + ans として累積和を更新します。
最後に ret を返します。
C++による実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if(n == 0)return 1;
n = min(10, n);
if(n == 1)return 10;
int ans = 9;
int ret = 10;
for(int i = 2; i<= n; i++){
ans *= (9 - i + 2);
ret += ans;
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.countNumbersWithUniqueDigits(3));
}入力例
3
出力例
739
この実装では、n = 3 の場合に 739 という結果が得られます。これは 0 から 999 までの数のうち、同じ数字が 2 回以上現れない数の総数です。計算量は O(n) と非常に効率的であり、n が大きくなっても高速に動作します。
-
C++でN未満のすべての数を最大2種類の一意な数字で出力する方法
この問題では、整数Nが与えられ、N未満のすべての数のうち、最大2種類の異なる数字(ユニークな数字)のみを使用して構成される数を出力します。つまり、1つの数を作るために使える数字の種類は最大2つまでという制限があります。問題を理解するために、具体例を見てみましょう。入力: N = 17 出力: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16この例では、17未満の数はすべて1種類または2種類の数字で構成されているため、すべてが出力対象となります。解法のアプローチこの問題を解くには、2種類のユニークな数字のみで構成されるすべての数を生成します。数の生成プロセスは0から始
-
Pythonで偶数桁の数字を数える方法
数値のリストが与えられたとき、桁数が偶数である数字の個数を数える問題を考えてみましょう。 例えば、配列が [12, 345, 2, 6, 7896] の場合を想定します。「12」は2桁、「7896」は4桁なので桁数が偶数です。一方、「345」「2」「6」は桁数が奇数のため対象外となります。したがって、この場合の出力は 2 になります。 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 リストを受け取り、各整数を文字列に変換する 変換後の文字列の長さ(=桁数)が偶数であれば、カウントを1つ増やす すべての要素を処理したら、最終的なカウント値を返す 実装例 それでは、