【C++】「数値+逆順(数値)=10^N−1」を満たすN桁の数の個数を求める方法
本記事では、指定された条件を満たすN桁の数値の個数を求めるプログラムについて解説します。
具体的には、整数Nが与えられたとき、次の条件を満たすN桁の数値がいくつ存在するかを求めます。
数値 + 逆順(数値) = 10N − 1
例えばN = 4の場合、104 − 1 = 9999となるため、「数値とその逆順の和が9999になるような4桁の数」がいくつあるかを数えることになります。
考え方
この問題にはシンプルな数学的な性質があります。
- Nが奇数の場合: 条件を満たす数値は1つも存在しないため、答えは0になります。
- Nが偶数の場合: 各桁のペア(先頭と末尾、2桁目と末尾から2番目…)の和が必ず9になる必要があります。そのため、自由に決められるのは上位N/2桁だけで、先頭の桁は1〜9の9通り、残りのN/2 − 1桁はそれぞれ0〜9の10通りから選べます。
つまり、Nが偶数のときの答えは9 × 10N/2 − 1となります。例えばN = 4なら、9 × 10 = 90個です。
答えが非常に大きな値になる可能性があるため、ここでは結果を数値ではなく文字列として構築しています。
実装例
#include <bits/stdc++.h>
using namespace std;
// 条件を満たす数値の個数を文字列として返す
string count_num(int N){
// Nが奇数なら条件を満たす数は存在しない
if (N % 2 == 1)
return "0";
// 9 × 10^(N/2 - 1) を文字列で表現する
string result = "9";
for (int i = 1; i <= N / 2 - 1; i++)
result += "0";
return result;
}
int main(){
int N = 4;
cout << count_num(N);
return 0;
}出力
90
計算量
時間計算量: O(N)
空間計算量: O(N)
ループは最大でもN/2回しか実行されないため、Nが大きくなっても高速に動作します。
-
C++でグリッド内の指定方向に実行可能な移動回数をカウントする方法
サイズ n × m のグリッドと、開始座標 (x, y) を表す変数が与えられます。さらに、グリッド内を移動するために使用できるステップのペア(例:(1,1)、(2,2) など)も与えられます。各ペアは、x 軸と y 軸方向に進む単位移動量を表します。ゴールは、境界 [1, n] × [1, m] の範囲内でグリッド内を移動できる合計ステップ数を求めることです。 たとえば、n = 5、m = 4、現在位置が (2, 2)、選択したステップが (1, -1) の場合を考えてみましょう。このステップを 1 回適用すると (3, 1) に移動できますが、もう 1 回適用すると (4, -1) となり
-
C++で指定された3つの条件を満たす数aとbを見つける方法
整数 n が与えられたとき、以下の3つの条件をすべて満たす2つの数 a と b を見つけることを考えます。a mod b = 0(aがbで割り切れる)a * b > n(積がnより大きい)a / b < n(商がnより小さい)条件を満たすペアが存在しない場合は、-1を出力します。例として、n = 10 の場合、a = 90、b = 10 とすると、上記の3つの条件をすべて満たします。解法のアプローチこの問題は、次の手順で効率的に解くことができます。b = n と固定します。すると、a は残りの条件から導き出せます。a mod b = 0 となるのは、a が b の倍数のときです。a