C++でn以下のすべての階乗数を効率的に求める方法
本記事では、C++を使ってn以下のすべての階乗数を出力する方法を解説します。
階乗数とは
階乗数(factorial number)とは、ある正の整数の階乗として表せる数のことです。たとえば、1! = 1、2! = 2、3! = 6、4! = 24、5! = 120 となるため、1、2、6、24、120 はいずれも階乗数に該当します。
アルゴリズムの考え方
n以下の階乗数を求める際、毎回ゼロから階乗を計算し直す必要はありません。初期値として fact = 1 を用意し、変数 i を 2 から順に増やしながら fact に i を掛けていくだけで、1!、2!、3!、… と次々に求められます。fact が n を超えた時点でループを終了すればよいため、非常にシンプルかつ効率的な手法です。
処理の手順
- fact = 1、i = 2 で初期化する
- fact が n 以下である限り、fact を出力する
- fact に i を掛け、その後 i をインクリメントする
- fact が n を超えたら処理を終了する
C++での実装例
#include <iostream>
using namespace std;
void getFactorialNumbers(int n) {
int fact = 1;
int i = 2;
while (fact <= n) {
cout << fact << " ";
fact = fact * i;
i++;
}
}
int main() {
int n = 150;
getFactorialNumbers(n);
}
実行結果
1 2 6 24 120
まとめ
この方法では、各階乗を直前の階乗に対して1回の掛け算を行うだけで求められるため、無駄な再計算が発生しません。階乗は極めて速く増加するため、nが大きくなってもループの反復回数はごくわずかで済みます。n以下の階乗数を列挙したい場合に、ぜひ活用してみてください。
-
各要素がN以下となる一意なペアを見つけるC++プログラム
この記事では、要素がN以下であり、かつ以下の条件を満たす一意な数のペアを見つけるプログラムについて詳しく解説します。2つの数の差の2乗が、それらの最小公倍数(LCM)と等しいこと。2つの数の最大公約数(HCF)が、連続する2つの数の積として表せること。問題を解くためのアプローチこの問題を効率的に解くには、1から始まる連続する2つの数を取り、その積の倍数を順に調べる方法が有効です。その中からペアを特定するために、候補となる2つの数が最初の条件(差の2乗 = LCM)を満たしているかどうかを確認します。具体例:2と3の場合まず、2と3という連続する数を考えてみましょう。その積は6です。6の倍数を順
-
大きな数の階乗を求める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 mai