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の倍数になるためです。
したがって、Nが5以上であっても、それらの階乗は合計の下一桁に一切影響を与えません。結果として、N = 4以降は下一桁が常に3になります。
下一桁の対応表
| N | 階乗の合計 | 下一桁 |
|---|---|---|
| 1 | 1! = 1 | 1 |
| 2 | 1! + 2! = 3 | 3 |
| 3 | 1! + 2! + 3! = 9 | 9 |
| 4 | 1! + 2! + 3! + 4! = 33 | 3 |
| 5以上 | 4!までの合計に下一桁0の階乗を加算 | 3 |

C++での実装例
この性質を利用すれば、Nがどれほど大きな値でも、あらかじめ用意した表を参照するだけで下一桁を即座に求められます。以下がそのC++コードです。
#include<iostream>
#include<cmath>
using namespace std;
double getUnitPlace(int n) {
int placeVal[5] = {-1, 1, 3, 9, 3};
if(n > 4){
n = 4;
}
return placeVal[n];
}
int main() {
for(int i = 1; i<10; i++){
cout << "N = " << i << " のときの階乗の合計の下一桁: " << getUnitPlace(i) << endl;
}
}実行結果
N = 1 のときの階乗の合計の下一桁: 1
N = 2 のときの階乗の合計の下一桁: 3
N = 3 のときの階乗の合計の下一桁: 9
N = 4 のときの階乗の合計の下一桁: 3
N = 5 のときの階乗の合計の下一桁: 3
N = 6 のときの階乗の合計の下一桁: 3
N = 7 のときの階乗の合計の下一桁: 3
N = 8 のときの階乗の合計の下一桁: 3
N = 9 のときの階乗の合計の下一桁: 3
コードの解説
getUnitPlace関数では、配列placeValにN = 0〜4に対応する下一桁の値 {-1, 1, 3, 9, 3} を格納しています。Nが4より大きい場合は下一桁が常に3であるため、nを4に制限しています。この実装により、Nの値に関わらずO(1)の定数時間で答えを求めることができ、大きなNに対しても階乗を実際に計算する必要がありません。
-
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++でN階乗の合計の下2桁を求める方法
本記事では、1!からN!までの階乗の合計について、その下2桁(一の位と十の位)を求める方法を解説します。例えば N = 4 の場合、1! + 2! + 3! + 4! = 33 となるため、一の位は「3」、十の位は「3」であり、結果は「33」となります。この問題には重要な性質があります。N が 5 より大きい場合、その階乗の一の位は必ず 0 になるため、6! 以降の項は一の位に一切影響を与えません。同様に、N が 10 以上になると十の位も 0 のまま変化しなくなります。したがって、N = 10 以上では結果は常に「13」で固定されます。実際に N = 1 から 10 までの階乗の値を表に整理