C++でa^bに最も近いxの倍数を求める方法
3つの整数 a、b、x が与えられたとき、ab の値に最も近い x の倍数を求めることを考えます。
例えば、a = 5、b = 4、x = 3 の場合を考えてみましょう。54 = 625 ですが、625 に最も近い 3 の倍数は 624 となります。これが求めるべき出力です。
解法のアプローチ
この問題は非常にシンプルで、以下の手順に従うことで解決できます。
- まず num = ab を計算します。
- 次に f = floor(num / x)(num を x で割った値の切り捨て)を求めます。
- 左側(小さい側)で最も近い候補は cl = x × f、右側(大きい側)の候補は cr = x × (f + 1) となります。
- 最後に、num − cl と cr − num のうち小さい方を採用すれば、それが最も近い倍数です。
C++での実装例
#include <iostream>
#include <cmath>
using namespace std;
long long getClosest(int a, int b, int x) {
long long num = pow(a, b);
int f = floor(num / x);
long long cl = x * f;
long long cr = x * (f + 1);
if ((num - cl) < (cr - num))
return cl;
else
return cr;
}
int main() {
int a = 5, b = 4, x = 3;
cout << "Find closest element: " << getClosest(a, b, x);
}実行結果
Find closest element: 624
このように、べき乗の計算結果に対して商の切り捨て値を使えば、左右両隣の倍数を簡単に特定でき、距離を比較するだけで最も近い倍数を効率的に求めることができます。なお、大きな指数を扱う場合はオーバーフローに注意し、必要に応じて long long 型などの十分な桁数を持つデータ型を使用することをおすすめします。
-
C++で二分探索木(BST)からターゲットに最も近いk個の値を検索する方法
問題概要 二分探索木(BST)とターゲット値が与えられたとき、BST内の値の中からターゲットに最も近いk個の値を見つけることを考えます。ここで、ターゲット値は浮動小数点数である点に注意してください。なお、kは常に有効であり、k ≤ 全ノード数が成り立つものと仮定できます。 例として、次のような木を考えてみましょう。 target = 3.714286、k = 2 の場合、出力は [4, 3] となります。 解法のアプローチ この問題は、「ターゲットより小さい値」を管理するスタックと「ターゲット以上の値」を管理するスタックの2本を用いることで効率的に解けます。各スタックには中間順走査(in-
-
C++で二分木における最も近い葉ノードまでの距離を求める方法
二分木が与えられ、その葉ノードはそれぞれ異なるレベルに存在するとします。さらに、あるノードを指すポインタが与えられ、そのノードから最も近い葉ノードまでの距離を求める必要があります。例として、次のような二分木を考えてみましょう。この木における葉ノードは 2、-2、6 の3つです。もしポインタがノード -5 を指している場合、-5 から最も近い葉ノードまでの距離は 1 となります。解決のアプローチこの問題を解くには、次の手順で考えます。まず、指定されたノードを根とする部分木を走査し、その部分木内で最も近い葉ノードを見つけて距離を記録します。次に、木の根から全体を走査します。ノード x が左部分木に