C++ で pow() 関数を使用せずに指数を計算する

Shikha Chaudhary 2023年10月12日
  1. C++ で pow() 関数を使用せずに指数を計算する
  2. C++ で pow() 関数を使用せずに for ループを使用して指数を計算する
  3. while ループを使用して、C++ で pow() 関数を使用せずに指数を計算する
  4. C++ で pow() 関数を使用せずに再帰を使用して指数を計算する
  5. まとめ
C++ で pow() 関数を使用せずに指数を計算する

C++ は、他の多くのプログラミング言語と同様に、タスクを容易にする関数とモジュールを含む組み込みライブラリが付属しています。 pow() 関数は、数値の累乗を簡単に計算できる組み込み関数の 1つです。

ただし、コーディング プラットフォームのように、組み込み関数を使用せずに数値の累乗を求めなければならない場合があります。 あなたがそれをどのように行うかについての推測はありますか?

この記事では、pow() 関数を使用せずに数値の指数を計算するさまざまな方法について説明します。

C++ で pow() 関数を使用せずに指数を計算する

pow() 関数を使用する別の方法に進む前に、まず pow() 関数が C++ でどのように機能するかを見てみましょう。

C++ の pow() 関数

名前が示すように、pow() または power 関数は数値の累乗を計算します。 この関数は引数として 2つの値を取り、ヘッダー ファイルも使用する必要があります。

pow() 関数で渡す最初の値は基数として機能し、2 番目の値は基数を上げるべき指数です。 これは、pow() 関数を使用して 5^3 の値を計算するプログラムです。

#include <math.h>
#include <stdio.h>

#include <iostream>

using namespace std;
int main() {
  double b = 5.0, p = 3.0, ans;
  ans = pow(b, p);

  cout << ans;

  return 0;
}

出力:

125

pow() 関数は引数として int ではなく double 値を取ることに注意してください。 しかし、これは pow() 関数が整数で使用できないという意味ではありません。

ただし、一部のコンパイラでは、pow() 関数で int を使用すると、不合理な出力が得られることがあります。 たとえば、pow(4,2) は、一部のコンパイラで 15 として出力される場合があります。

そのため、double データ型で pow() 関数を使用することをお勧めします。

pow() 関数の基本がわかったので、C++ で pow() 関数を使用せずに数値の指数を計算する他の方法について説明しましょう。

C++ で pow() 関数を使用せずに for ループを使用して指数を計算する

数値の指数を計算する際に、乗算を繰り返し使用することがわかっています。 この乗算が繰り返される回数は、指数または基数のべき乗によって異なります。

これは同じ例です。

5^4 = 5 * 5 * 5 * 5 = 625

この概念は、for ループを使用してプログラミングに適用することもできます。 これが同じコードです。

#include <math.h>
#include <stdio.h>

#include <iostream>

using namespace std;
int main() {
  int i, e, b, ans = 1;

  cout << "Enter the base: " << endl;
  cin >> b;

  cout << "Enter the exponent: " << endl;
  cin >> e;

  /*logic to calculate power*/

  for (i = 1; i <= e; ++i) {
    ans = ans * b;
  }

  cout << "The solution is: " << ans;

  return 0;
}

出力:

Enter the base:
5
Enter the exponent:
4
The solution is: 625

では、このコードでは何が起こっているのでしょうか?

変数 be は、それぞれ基数と指数を表します。 さらに、変数 ans は値 1 を保持し、変数 ifor ループの実行回数を定義します。

ここで、pow() 関数で機能するロジックは、このコードの for ブロックから始まることを理解してください。 それでは、for ブロック内で何が起こっているかを分析してみましょう。

i1 に初期化されており、指数の値、ここでは 4 まで上がっていることがわかります。 また、ループ内のステートメントは、bans を乗算し、その結果を変数 ans 自体に格納します。

以下は、反復ごとに変数 ans に含まれるものです。

i=1
ans = 1*5
ans = 5

i=2
ans = 5*5
ans = 25

i=3
ans = 25*5
ans = 125

i=4
ans = 125*5
ans = 625

そして明らかに、ループが終了すると、変数 ans の最終値が出力として返されます。 これは基本的に、pow() 関数を使用せずに for ループを使用して数値の指数を計算する方法です。

while ループを使用して同じことを実行してみましょう。

while ループを使用して、C++ で pow() 関数を使用せずに指数を計算する

while ループを使用して数値の指数を計算する基本的な考え方は、for ループと同じです。 唯一の変更点は、繰り返し回数のカウント方法です。

以下のコードを見てください。

ここで、while ブロックでは、e の初期値はユーザーが指数として入力したものであり、各ステップで値が 1 ずつ減少します。 最後に、e0 に減少すると、ループは終了します。

#include <math.h>
#include <stdio.h>

#include <iostream>

using namespace std;
int main() {
  int i, e, b, ans = 1;

  cout << "Enter the base: " << endl;
  cin >> b;

  cout << "Enter the exponent: " << endl;
  cin >> e;

  /*logic to calculate power*/

  while (e != 0) {
    ans = ans * b;
    --e;
  }

  cout << "The solution is: " << ans;

  return 0;
}

出力:

Enter the base:
5
Enter the exponent:
4
The solution is: 625

while ループ内のステートメントは、for ループの場合と同様に、bans で乗算し、その結果を変数 ans 自体に格納することがわかります。

以下は、反復ごとに変数 ans に含まれるものです。

e = 4
ans = 1 * 5
ans = 5

e = 3
ans = 5 * 5
ans = 25

e = 2
ans = 25 * 5
ans = 125

e = 1
ans = 125 * 5
ans = 625

これは、pow() 関数を使用せずに、while ループを使用して数値の指数を計算する方法です。

出力に対してさらに他の操作を実行する場合は、次の例に示すように実行できます。

#include <math.h>
#include <stdio.h>

#include <iostream>

using namespace std;
int main() {
  int i, e, b, ans = 1;

  cout << "Enter the base: " << endl;
  cin >> b;

  cout << "Enter the exponent: " << endl;
  cin >> e;

  /*logic to calculate power*/

  while (e != 0) {
    ans = ans * b;
    --e;
  }

  /*adding 500 to the result*/

  ans = ans + 500;
  cout << "The solution after addition is: " << ans;

  return 0;
}

出力:

Enter the base:
5
Enter the exponent:
4
The solution after addition is: 1125

基数と指数が ints の場合、これらの方法を使用して指数を計算することをお勧めします。 float 値の場合は、pow() 関数を使用します。

これら両方の方法の複雑さは O(n) で、n は指数です。

これまで、数値の累乗を見つけるための通常のループ方法について説明してきました。 同じことを行うための非常に興味深い再帰的ソリューションについて説明しましょう。

C++ で pow() 関数を使用せずに再帰を使用して指数を計算する

以下のコードを見てください。

#include <math.h>
#include <stdio.h>

#include <iostream>

using namespace std;

int product(int a, int b) {
  if (b)
    return (a + product(a, b - 1));
  else
    return 0;
}

int calculate_power(int x, int y) {
  if (y)
    return product(x, calculate_power(x, y - 1));
  else
    return 1;
}

int main() {
  cout << calculate_power(5, 2);
  getchar();
  return 0;
}

出力:

25

このコードは、乗算を繰り返すための productx^y を見つけるための calculate_power の 2つの関数を使用します。

main ブロックが実行されると、まず calculate_power 関数に制御が移ります。 この関数内で、指数 y の値が 0 の場合、制御は if ブロックに進み、関数は 1 を返します。

それ以外の場合、制御は if ブロックに移動し、そこで関数は product 関数を呼び出します。この関数は calculate_power 関数を再帰的に呼び出します。 また、product 関数内では、制御が if ブロックに移動すると、product 関数が再帰的に呼び出されます。

このコードの動作をよりよく理解するのに役立つ図を次に示します。

Coming down:                       calculate_pow(5,2)
                            product(5, calculate_pow(5,1))
                                           product(5, calculate_pow(5, 0)
                                                           return 1


Going back, Step 1:                 product(5, 1)
                                return 5 + product(5, 0)
                                              return 0
                                            return 5+0 = 5


Going back, Step 2:                 product(5, 5)
                                         5 + product(5, 4)
                                                5 + 5 + product(5, 3)
                                                       5 + 5 + 5 + product(5, 2)
                                                            5 + 5 + 5 + 5 + product(5, 1)
                                                                      5 + 5 + 5 + 5 + 5
                                                                              25

これは、再帰が数値の累乗を計算する方法です。時間計算量は O(n) で、n は指数です。

まとめ

この記事では、C++ で pow() 関数を使用せずに数値の指数を計算する方法について説明しました。 forwhile ループを使用してこれを行い、数値の累乗を取得したら、他の計算をさらに実行する方法も確認しました。

最も興味深いのは、数値の累乗を計算するための再帰的なソリューションについて説明し、詳細なフローチャートを使用してそのコードの動作を確認したことです。

関連記事 - C++ Math