Xで割り切れる最大のK桁の数を求めるC++プログラム
この記事では、「Xで割り切れる最大のK桁の整数」を求める問題をC++で解く方法を解説します。一見すると複雑そうに思えますが、実は非常にシンプルな数式だけで答えを導き出せる、アルゴリズム学習に最適な題材です。
解法の基本的な考え方
K桁の最大の整数は、次の公式で簡単に求められます。
max = 10^k − 1
例えば5桁なら「99999」、6桁なら「999999」となります。この最大値がそのままXで割り切れれば、それが答えです。もし割り切れない場合は、次の式を使うことで、Xで割り切れる最大のK桁の数を一発で計算できます。
max − (max mod X)
具体例:5桁かつ29の倍数となる最大の数
まず、5桁の最大値である「99999」を考えます。しかし、99999は29では割り切れません(99999 ÷ 29 の余りは7)。そこで上記の公式を適用すると、
99999 − (99999 mod 29) = 99999 − 7 = 99992
となり、答えは「99992」です。実際に99992は29で割り切れることが確認できます。
アルゴリズム
maxKDigit(k, x)
begin
max = (10^k) - 1
if max is divisible by x, return max
otherwise return max – (max mod x)
end処理の流れは以下の通りです。
- 10^k − 1 を計算し、K桁の最大値 max を求める
- max が X で割り切れる場合は、そのまま max を返す
- 割り切れない場合は、max から「max を X で割った余り」を引いた値を返す
C++による実装例
#include<iostream>
#include<cmath>
using namespace std;
long max_k_digit(int k, int x){
// K桁の最大値を取得
int max = pow(10, k) - 1;
if(max % x == 0){
return max;
}
return (max) - (max % x);
}
main() {
int k, x;
cout << "Enter Digit Count(K) and Divisor(N): ";
cin >> k >> x;
cout << "Result is: " << max_k_digit(k, x);
}このコードでは、pow(10, k) - 1 でK桁の最大値を計算し、剰余演算子 % を使って余りを差し引いています。計算量はO(1)であり、非常に効率的です。
実行結果
例1:5桁・29の場合
Enter Digit Count(K) and Divisor(N): 5 29 Result is: 99992
例2:6桁・87の場合
Enter Digit Count(K) and Divisor(N): 6 87 Result is: 999978
まとめ
Xで割り切れる最大のK桁の数は、「K桁の最大値(10^k − 1)から、それをXで割った余りを引く」というシンプルな式で求められます。ループで一つずつ確認する方法と比べて計算量が大幅に少なく、競技プログラミングや数学的思考のトレーニングにも役立つテクニックです。ぜひ自分のコードでも活用してみてください。
-
C++で10進数を2進数に変換するプログラムの書き方
コンピューターの内部では、すべてのデータが2進数(基数2)として扱われています。一方、私たちが日常的に使う10進数は「0〜9」の数字を組み合わせた基数10の記数法です。この記事では、C++を使って入力された10進数を2進数へ変換するプログラムの考え方と実装方法を解説します。10進数から2進数への変換手順10進数を2進数に変換する基本的な方法は、「2で割った余りを順番に記録していく」ものです。具体的には次の手順で行います。まず、変換したい数値を基数である2で割り、商と余りを求めます。余りが0であればその桁は「0」、1であれば「1」として記録します。続いて、得られた商をさらに2で割り、同じように余
-
Xで割り切れる最小のK桁の数を求めるPythonプログラム
この記事では、「指定した整数Xで割り切れる最小のK桁の数」を求める問題の解き方とアプローチについて詳しく解説します。問題文2つの整数 K(桁数)と X(割る数)が与えられます。Xで割り切れる最小のK桁の整数を求めてください。アプローチこの問題は、以下のシンプルな手順で解くことができます。まず、K桁の数のうち最小の値 MIN を求めます。MIN は「1の後に0が(K−1)個並ぶ数」、すなわち 10K−1 です(例:K=5なら 10000)。もし MIN を X で割った余りが 0 であれば、MIN がそのまま答えになります。そうでない場合は、答えは (MIN + X) − ((MIN + X)