C++でn桁のステッピング数を数える方法を解説
ステッピング数(Stepping Number)とは、隣り合う桁同士の差がすべて1となっている数のことです。この記事では、桁数を表す整数 n が与えられたとき、n 桁のステッピング数が全部で何個あるかを数える方法を解説します。
具体例
まずは例を見てみましょう。
入力
2
出力
17
2桁の数のうち最小は10、最大は99です。この範囲には 10, 12, 21, 23, …, 89, 98 のように、合計17個のステッピング数が存在します。
アルゴリズム
ここでは、n桁のすべての数を順番に調べるシンプルな全探索アプローチを紹介します。手順は以下の通りです。
- 桁数 n を初期化します。
- カウント用の変数を 0 で初期化します。
- n桁の最小値を求めます。具体的には pow(10, n - 1) です。
- n桁の最大値を求めます。具体的には pow(10, n) - 1 です。
- 最小値から最大値まで順番にループ処理を行います。
- 現在の数がステッピング数かどうかを判定します。
- 数値内の隣接する桁同士の差を確認し、1つでも差が1でない桁があれば false を返し、すべての差が1なら true を返します。
- 現在の数がステッピング数であれば、カウントを1増やします。
- 最後にカウントを返します。
C++での実装
以下は、上記のアルゴリズムをC++で実装した例です。
#include <bits/stdc++.h>
using namespace std;
bool isSteppingNumber(int n) {
int previousDigit = -1;
while (n) {
int currentDigit = n % 10;
if (previousDigit != -1 && abs(previousDigit - currentDigit) != 1) {
return false;
}
previousDigit = currentDigit;
n /= 10;
}
return true;
}
int getSteppingNumbersCount(int n) {
int lowestNumber = pow(10, n - 1), highestNumber = pow(10, n) - 1;
int count = 0;
for (int i = lowestNumber; i <= highestNumber; i++) {
if (isSteppingNumber(i)) {
count += 1;
}
}
return count;
}
int main() {
int n = 3;
cout << getSteppingNumbersCount(n) << endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
32
これは、3桁の範囲(100〜999)にはステッピング数が32個存在することを示しています。
補足:計算量について
この方法は非常にシンプルで分かりやすい一方、調査対象の数は約 9 × 10n-1 個に及ぶため、n が大きくなるほど処理時間が急激に増加します。より大きな n に対応したい場合は、先頭の桁から順に「差が1となる次の桁」だけを枝狩りしながら数え上げるDFS(深さ優先探索)やBFS(幅優先探索)を用いることで、効率的に答えを求めることができます。
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ