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

C++で数値の5乗根の床値を求める方法【線形探索と二分探索】

この問題では、数値 N が与えられ、その5乗根の床値(小数点以下を切り捨てた整数値)を求めることが課題となります。

ある数の5乗根とは、その数自身を5回掛け合わせると元の数になる値のことです。

つまり、N1/5 = a であるとき、a × a × a × a × a = N が成り立ちます。

例で問題を理解しよう

入力:N = 325

出力:3

説明:

325 の5乗根は約 3.179 であり、その床値は 3 になります。

解法アプローチ1:線形探索

最もシンプルな解決策は、1 から n まで順番に走査し、自分自身を5回掛けると n になる(または n を超える直前の)数を見つける方法です。

ただし、与えられる数が必ずしも完全な5乗数であるとは限らないため、正確な値は得られません。そこで、5乗した結果が初めて n を超える値を見つけ、その値から 1 を引くことで、5乗根の床値を求めます。

実装例1:線形探索による解法

#include<iostream>
using namespace std;

int calcFifthRoot(int n) {
   
   if (n == 0 || n == 1)
      return n;

   int a = 0;
   for(a = 1; a*a*a*a*a < n ; a++){
     
   }
   return (a - 1);
}

int main() {
   
   int n = 325;
   cout<<"The Floor of fifth root of "<<n<<" is "<<calcFifthRoot(n);
   return 0;
}

出力

The Floor of fifth root of 325 is 3

このアルゴリズムは正しく動作しますが、計算量が O(n) となるため、大きな n に対しては非効率です。より優れた解決策として、探索アルゴリズムを改良し、二分探索(バイナリサーチ)を使って5乗根を効率的に求める方法があります。これにより計算量を O(log n) まで削減できます。

二分探索では、探索範囲の中央値 a の5乗と n を比較し、a の5乗が n より小さければ探索範囲を上半分に、大きければ下半分に絞り込んでいきます。見つかった最大の候補値を記録しておき、ループ終了後にそれを返すことで床値が得られます。

実装例2:二分探索による解法

#include<iostream>
using namespace std;

int calcFifthRoot(int n)
{
   if (n == 0 || n == 1)
   return n;

   int start = 1, end = n, root = 0;
   while (start <= end)
   {
      int a = (start + end) / 2;
      long int apowfive = a*a*a*a*a;

      if (apowfive == n)
         return a;
      if (apowfive < n) {
         
         start = a + 1;
         root = a;
      }
      else
         end = a - 1;
   }
   return root;
}

int main() {
   
   int n = 250;
   cout<<"The floor of fifth root of "<<n<<" is "<<calcFifthRoot(n);
   return 0;
}

出力

The floor of fifth root of 250 is 3

まとめ

本記事では、C++ で数値の5乗根の床値を求める2つの方法を紹介しました。単純な線形探索は理解しやすいものの O(n) の計算量が必要であり、二分探索を用いることで O(log n) に大幅に高速化できます。大きな数値を扱う場合は、二分探索版の実装を採用することをおすすめします。

  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 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の