C++で数値の立方根を求める方法:二分探索を使った実装を解説
はじめに
この記事では、数値の立方根(3乗根)を求める方法を解説します。例えば、27という数値の立方根は3です。ここでは、標準ライブラリの関数に頼らず、独自のロジックでこの問題を解決します。具体的には「二分探索(バイナリサーチ)」の手法を活用します。
アルゴリズムの考え方
まず、許容誤差(しきい値)として threshold = 0.000001 を設定します。その上で、以下の手順に従って処理を進めます。
- 左端の値(left)を 0、右端の値(right)を対象の数値として初期化する
- 中央値を mid = (left + right) / 2 として計算する
- |数値 − mid³| が threshold より小さければ、mid を答えとして返す
- mid³ が数値より大きければ、right = mid とする
- mid³ が数値より小さければ、left = mid とする
C++での実装例
#include<iostream>
#include<cmath>
using namespace std;
// 二分探索によって立方根を求める関数
double cubeRoot(int num) {
double threshold = 0.000001; // 許容誤差
double left = 0, right = num; // 探索範囲
double mid;
while(left <= right){
mid = (left + right)/2;
// 誤差がしきい値以内なら答えとして返す
if(abs(num - (mid*mid*mid)) < threshold)
return mid;
// midの3乗が大きすぎる場合は探索範囲を左半分に狭める
if((mid*mid*mid) > num)
right = mid;
// midの3乗が小さすぎる場合は探索範囲を右半分に広げる
if((mid*mid*mid) < num)
left = mid;
}
}
int main() {
int n = 3;
cout << "cube root of 3 is: " << cubeRoot(n);
}実行結果
cube root of 3 is: 1.44225
コードのポイント
このプログラムでは、二分探索を繰り返し適用することで、立方根の候補値を段階的に絞り込んでいきます。mid の3乗が目的の数値とほぼ一致(誤差がしきい値以内)すれば探索を終了し、大きすぎれば探索範囲の上半分を、小さすぎれば下半分を切り捨てます。この操作を繰り返すことで、効率的に高精度な立方根を求めることができます。実際、3の立方根は約 1.44224957 であり、出力結果 1.44225 はしきい値の精度内で正しい値です。
注意点
この実装は 0 以上の数値を前提としています。負の数や、0 より大きく 1 より小さい数値に対しては、探索範囲の初期化を調整する必要があります。なお、実務では <cmath> ヘッダに用意されている cbrt() 関数を使えば、より簡単かつ堅牢に立方根を求められます。二分探索による実装は、アルゴリズムの学習や数値計算の仕組みを理解するうえで非常に有益な題材です。
-
C++で行列内の空洞(キャビティ)の数を見つける方法
空洞(キャビティ)とはここでは、与えられた行列の中に存在する「空洞(キャビティ)」の数を求める問題を考えます。ある要素が空洞とみなされるのは、その周囲に隣接するすべての要素(上下左右および斜め方向)が、その要素よりも大きい場合です。例として、次のような行列を見てみましょう。456715456この行列の場合、中央の「1」は周囲のすべての要素(4, 7, 4, 5, 5, 6, 5, 6)よりも小さいため空洞となり、出力は 1 になります。アルゴリズムの考え方基本的なアプローチはシンプルで、各要素について周囲の要素を順番にチェックし、すべての隣接要素より小さければ空洞としてカウントします。ただし、
-
【C++】Dで割り切れるN桁の数を見つけるアルゴリズム
2つの整数 N と D が与えられたとき、D で割り切れる N 桁の数を見つける問題を考えます。例えば、N = 3、D = 5 の場合、答えは 500 になります。一見難しそうに思えるこの問題ですが、実はとてもシンプルな発想で解決できます。解法のアイデア基本となる考え方は、「D を先頭に置き、その後ろに 0 を付け足して N 桁にする」というものです。D の桁数を m とすると、D の末尾に (N − m) 個の 0 を連結した数は、全体でちょうど N 桁となり、必ず D で割り切れます。これは、作成される数が D × 10(N−m) に相当し、10 のべき乗を掛けても D で割り切れるという