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

C++で a^b に最も近い x の倍数を求める方法

3つの値 a、b、x が与えられたとき、ab に最も近い x の倍数を求める問題を考えてみましょう。例えば、x = 4、a = 3、b = 3 の場合、33 = 27 に最も近い x の倍数は 28 となるため、出力は 28 になります。

解法のアプローチ

考え方はシンプルで、以下の条件に従って処理を分岐させます。

  • b < 0 かつ a = 1 の場合: ab は 1 になるため、x に最も近い倍数は 0 または x となります。

  • b < 0 かつ a > 1 の場合: ab は 1 より小さくなるため、x に最も近い倍数は 0 となります。

  • b > 0 の場合: まず ab を計算します。次に mul = ab / x(整数部分)とすると、x の倍数として最も近いのは mul × x または (mul + 1) × x のどちらかです。

C++による実装例

#include<iostream>
#include<cmath>
using namespace std;

void findMultiple(int a, int b, int x) {
    cout << "最も近い倍数: ";
    if (b < 0) {
        if (a == 1 && x == 1)
            cout << "1";
        else
            cout << "0";
        return;
    }
    int mul = pow(a, b);
    int ans = mul / x;
    int ans1 = x * ans;
    int ans2 = x * (ans + 1);
    if ((mul - ans1) <= (ans2 - mul)) {
        cout << ans1;
    }
    else {
        cout << ans2;
    }
}

int main() {
    int a = 3, b = 3, x = 4;
    findMultiple(a, b, x);
    return 0;
}

実行結果

最も近い倍数: 28

コードの解説

このプログラムの流れを順に見ていきましょう。

  1. まず、b が負の場合を判定します。a = 1 で x = 1 のときは結果が 1、それ以外は 0 を出力して処理を終了します。

  2. b が正の場合は pow(a, b) で ab を計算し、それを x で割った商(整数部分)を求めます。

  3. 商に x を掛けた値(ans1)と、商に 1 を足してから x を掛けた値(ans2)のうち、ab との差が小さい方を答えとして出力します。

この例では 33 = 27、27 ÷ 4 の商は 6 なので、候補は 6 × 4 = 24 と 7 × 4 = 28 の2つです。27 との差を比較すると 28 の方が近いため、28 が出力されます。

なお、pow 関数は浮動小数点数を返すため、大きな指数を扱う場合はオーバーフローや精度の問題に注意が必要です。実用的なコードでは、繰り返し乗算によるべき乗計算や long long 型の使用を検討するとよいでしょう。

  1. C++で指定された値に最も近いk個の要素を検索する方法

    いくつかの要素を含む配列 A があるとします。ここに、値 X と整数 k も与えられます。この課題は、配列 A の中から X に最も近い k 個の要素を見つけることです。なお、X が配列内に存在する場合は、その要素自体は出力に含めません。 例として、A = [12, 16, 22, 30, 35, 39, 42, 45, 48, 50, 53, 55, 56]、X = 35、k = 4 とすると、出力は「30, 39, 42, 45」になります。 解法の考え方:二分探索を活用する この問題を効率的に解くには、二分探索(バイナリサーチ)の手法を利用します。二分探索によって「クロスオーバーポイ

  2. C++で原点に最も近いK個の点を見つけるアルゴリズムを解説

    平面上に複数の点が与えられたとき、その中から原点(0, 0)に最も近いK個の点を求める問題を考えてみましょう。 例として、点 (3, 3)、(5, -1)、(-2, 4) の3点が与えられ、K = 2 とします。このとき原点に最も近い2点は (3, 3) と (-2, 4) になります。 解決のアプローチ この問題は次の手順で解くことができます。 各点についてユークリッド距離を計算します。原点からの距離は √(x² + y²) で表されますが、大小比較だけであれば平方根の計算は不要なので、x² + y² の値をそのまま使えば十分です。 距離を基準に点のリストをソートします。 ソート後のリスト