大きな数の階乗を求めるC++プログラムの書き方
階乗とは、1からその数までのすべての整数を掛け合わせた値のことです。たとえば 5! = 5×4×3×2×1 = 120 となります。以下に、階乗を求めるC++プログラムの例を示します。
プログラム例
#include <iostream>
using namespace std;
unsigned long long int fact(unsigned long long int n) {
if (n == 0 || n == 1)
return 1;
else
return n * fact(n - 1);
}
int main() {
unsigned long long int n;
cout << "Enter number : ";
cin >> n;
cout << "\nThe factorial : " << fact(n);
return 0;
}
出力
Enter number : 20 The factorial : 2432902008176640000
大きな値に対応するデータ型
階乗は増加が非常に速いため、通常のint型ではすぐに表現できる範囲を超えてしまいます。そこで本プログラムでは、より大きな非負整数を扱える次のデータ型を使用しています。
unsigned long long int n;
この型は一般的な環境で64ビット幅を持ち、最大でおよそ1.8×1019(約1844京)までの値を格納できます。
fact()関数の処理内容
階乗の実際の計算はfact()関数内で行われます。この関数は再帰的に呼び出され、nが0または1の場合は1を返し、それ以外の場合は n × fact(n − 1) を返します。
unsigned long long int fact(unsigned long long int n) {
if (n == 0 || n == 1)
return 1;
else
return n * fact(n - 1);
}
main()関数の処理内容
main()関数では、ユーザーが入力した数値を受け取り、fact()関数を呼び出します。そして、その結果として得られた階乗の値を出力します。
cout << "Enter number : "; cin >> n; cout << "\nThe factorial : " << fact(n);
注意点:オーバーフローについて
unsigned long long int型でも、21!以降は表現可能な範囲を超えるため正しく計算できません。さらに大きな階乗を扱いたい場合は、Boost.Multiprecisionなどの多倍長整数ライブラリの利用を検討してください。
-
C++で階乗を求めるプログラム|再帰・非再帰の2つの実装方法を解説
非負整数 n の階乗とは、n 以下のすべての正の整数を掛け合わせた積のことです。たとえば、5 の階乗は次のように計算されます。5! = 5 × 4 × 3 × 2 × 1 5! = 120整数の階乗は、再帰的なプログラムまたは非再帰的なプログラムのいずれかで求めることができます。ここでは、両方の実装例をサンプルコードとともに紹介します。 方法1:非再帰プログラム(forループ)で階乗を求める 最もシンプルな方法は、for ループを使って 1 から n まで順番に掛け合わせていく方法です。以下のプログラムでその実装を見てみましょう。 サンプルコード #include <iostream&g
-
Pythonで巨大な数の階乗を計算するプログラム
非常に大きな数 n の階乗を求めたい場面は、プログラミングにおいてよくあります。他の多くのプログラミング言語では、大きな数の階乗は整数データ型(int型など)の表現範囲を簡単に超えてしまうため、そのままでは計算できず、特別なライブラリや多倍長整数の実装が必要になります。しかし、Python には整数の桁あふれという概念がありません。Pythonは整数の大きさを自動的に検出し、必要に応じて内部的により大きな整数表現へと拡張してくれるため、標準ライブラリだけで任意の大きさの階乗を簡単に計算できます。例えば、入力が n = 50 の場合、出力は次のようになります。304140932017133780