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

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

処理の流れは以下の通りです。

  1. 10^k − 1 を計算し、K桁の最大値 max を求める
  2. max が X で割り切れる場合は、そのまま max を返す
  3. 割り切れない場合は、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で割った余りを引く」というシンプルな式で求められます。ループで一つずつ確認する方法と比べて計算量が大幅に少なく、競技プログラミングや数学的思考のトレーニングにも役立つテクニックです。ぜひ自分のコードでも活用してみてください。

  1. C++で10進数を2進数に変換するプログラムの書き方

    コンピューターの内部では、すべてのデータが2進数(基数2)として扱われています。一方、私たちが日常的に使う10進数は「0〜9」の数字を組み合わせた基数10の記数法です。この記事では、C++を使って入力された10進数を2進数へ変換するプログラムの考え方と実装方法を解説します。10進数から2進数への変換手順10進数を2進数に変換する基本的な方法は、「2で割った余りを順番に記録していく」ものです。具体的には次の手順で行います。まず、変換したい数値を基数である2で割り、商と余りを求めます。余りが0であればその桁は「0」、1であれば「1」として記録します。続いて、得られた商をさらに2で割り、同じように余

  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)