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

C++で数値のN乗根を求める方法

はじめに

N乗根とその計算結果が与えられたとき、numberN = result を満たす元の数値を求める必要があります。本記事では、C++を使ってこの問題を解く方法を解説します。

具体例

入力

result = 25
N = 2

出力

5

52 = 25 となるため、上記の例では出力は 5 になります。

入力

result = 64
N = 3

出力

4

43 = 64 となるため、上記の例では出力は 4 になります。

アルゴリズム

この問題は、1から順番に整数を試し、その数のN乗が結果と一致するかを確認するシンプルな線形探索(全探索)で解くことができます。

  1. カウンタ変数 i を 1 で初期化します。
  2. i の N 乗を計算し、result と一致するか確認します。
  3. 一致した場合、i を答えとして返します。
  4. 一致しない場合は、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 型の使用も検討しましょう。

  1. 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 など 問題を理解するための具

  2. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の