C++でB!÷A!の最後の桁を求めるアルゴリズム
問題の概要
2つの整数AとBが与えられ、B ≥ Aが成り立つとき、B! / A! の最後の桁(下一桁)を求めることを考えます。例として、A = 2、B = 4 の場合を見てみましょう。2! = 2、4! = 24 なので、24 ÷ 2 = 12 となり、最後の桁は「2」になります。
解法のポイント
階乗の最後の桁は必ず {0, 1, 2, 4, 6} のいずれかに含まれるという性質があります。この性質を利用すると、巨大な階乗を実際に計算しなくても、以下の手順で効率的に答えを求められます。
- AとBの差(diff)を求める
- diff ≥ 5 の場合、答えは 0 になる
- diff < 5 の場合は、(A + 1) から B までの各数値を順に掛け合わせる
- 掛け合わせた結果の最後の桁が答えとなる
diff ≥ 5 のときに答えが 0 になる理由は、連続する5つ以上の整数の中には必ず5の倍数と偶数が含まれ、それらを掛け合わせると10の倍数になるためです。
C++での実装例
#include<iostream>
using namespace std;
int findLastDigit(long long int A, long long int B) {
int x = 1;
if (A == B)
return 1;
else if ((B - A) >= 5)
return 0;
else {
for (long long int i = A + 1; i <= B; i++)
x = (x * (i % 10)) % 10;
return x % 10;
}
}
int main() {
cout << "Last digit is: " << findLastDigit(2, 4);
}
実行結果
Last digit is: 2
このコードでは、AとBが等しい場合は商が1になるため1を返し、差が5以上の場合は0を返します。それ以外の場合は、(A + 1) から B までの各数値の下一桁だけを掛け合わせ、10で剰余を取ることで最後の桁を求めています。階乗全体を計算しないため、大きな数値でもオーバーフローを気にせず高速に処理できるのが特徴です。
-
C++でN階乗の合計の下一桁(一の位)を求める方法
この記事では、C++を使って「1! + 2! + ... + N!」という階乗の合計の下一桁(一の位)を求める方法を解説します。例えばN = 3の場合、1! + 2! + 3! = 9 となるため答えは9、N = 4の場合は 1! + 2! + 3! + 4! = 33 となり、下一桁は3になります。階乗の下一桁の重要な性質この問題を解く鍵となるのは、5以上の数の階乗の下一桁が必ず0になるという性質です。5! = 120、6! = 720、7! = 5040 のように、5!以降はすべて一の位が0になります。これは、5以上の階乗には必ず因数2と5のペアが含まれ、10の倍数になるためです。したがっ
-
C++で階乗を求めるプログラム|再帰・非再帰の2つの実装方法を解説
非負整数 n の階乗とは、n 以下のすべての正の整数を掛け合わせた積のことです。たとえば、5 の階乗は次のように計算されます。5! = 5 × 4 × 3 × 2 × 1 5! = 120整数の階乗は、再帰的なプログラムまたは非再帰的なプログラムのいずれかで求めることができます。ここでは、両方の実装例をサンプルコードとともに紹介します。 方法1:非再帰プログラム(forループ)で階乗を求める 最もシンプルな方法は、for ループを使って 1 から n まで順番に掛け合わせていく方法です。以下のプログラムでその実装を見てみましょう。 サンプルコード #include <iostream&g