C++で数値のN乗根を求める方法
はじめに
N乗根とその計算結果が与えられたとき、numberN = result を満たす元の数値を求める必要があります。本記事では、C++を使ってこの問題を解く方法を解説します。
具体例
入力
result = 25 N = 2
出力
5
52 = 25 となるため、上記の例では出力は 5 になります。
入力
result = 64 N = 3
出力
4
43 = 64 となるため、上記の例では出力は 4 になります。
アルゴリズム
この問題は、1から順番に整数を試し、その数のN乗が結果と一致するかを確認するシンプルな線形探索(全探索)で解くことができます。
- カウンタ変数
iを 1 で初期化します。 iの N 乗を計算し、resultと一致するか確認します。- 一致した場合、
iを答えとして返します。 - 一致しない場合は、
iを 1 増やして手順 2 に戻ります。
C++での実装
以下は、上記のアルゴリズムをC++で実装したコード例です。
#include <bits/stdc++.h>
using namespace std;
int getNthRoot(int result, int n) {
int i = 1;
while (true) {
if (pow(i, n) == result) {
return i;
}
i += 1;
}
}
int main() {
int result = 64, N = 6;
cout << getNthRoot(result, N) << endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
2
26 = 64 であるため、64 の 6乗根 として正しく 2 が出力されていることがわかります。
注意点と改善案
この実装では pow 関数を使用していますが、pow は浮動小数点演算を行うため、扱う数値が大きくなると誤差が発生する可能性があります。また、答えが存在しない入力に対しては無限ループに陥る恐れがある点にも注意が必要です。
より効率的かつ安全にN乗根を求めたい場合は、二分探索を活用する方法が有効です。探索範囲を [1, result] とし、中央値の N 乗と result を比較しながら範囲を絞り込むことで、O(log result) の時間計算量で答えを求められます。大きな数値を扱う際には、オーバーフロー防止のため long long 型の使用も検討しましょう。
-
C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】
この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の