C++
 Computer >> コンピューター >  >> プログラミング >> C++

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 までの階乗の値を表に整理すると、この法則がよく分かります。

C++でN階乗の合計の下2桁を求める方法

解法のアプローチ

上記の性質を利用すると、この問題は次の手順で効率的に解くことができます。

  • n < 10 の場合:(1! + 2! + … + n!) を直接計算し、100 で割った余りを求める
  • n ≥ 10 の場合:(1! + 2! + … + 10!) mod 100 = 13 となるため、答えは常に 13 を返す

この方法により、n ≤ 10 のときは O(n)、それ以外は O(1) という非常に高速な計算が可能です。

C++による実装例

#include<iostream>
#include<cmath>
using namespace std;
int getTenAndUnitPlace(long long N) {
    if (N <= 10) {
        long long ans = 0, factorial = 1;
        for (int i = 1; i <= N; i++) {
            factorial = factorial * i;
            ans += factorial;
        }
        return ans % 100;
    }
    return 13;
}
int main() {
    for(long long i = 1; i<15; i++){
        cout << "N = " <<i<<" のときの階乗の合計の下2桁: " <<getTenAndUnitPlace(i) << endl;
    }
}

実行結果

N = 1 のときの階乗の合計の下2桁: 1
N = 2 のときの階乗の合計の下2桁: 3
N = 3 のときの階乗の合計の下2桁: 9
N = 4 のときの階乗の合計の下2桁: 33
N = 5 のときの階乗の合計の下2桁: 53
N = 6 のときの階乗の合計の下2桁: 73
N = 7 のときの階乗の合計の下2桁: 13
N = 8 のときの階乗の合計の下2桁: 33
N = 9 のときの階乗の合計の下2桁: 13
N = 10 のときの階乗の合計の下2桁: 13
N = 11 のときの階乗の合計の下2桁: 13
N = 12 のときの階乗の合計の下2桁: 13
N = 13 のときの階乗の合計の下2桁: 13
N = 14 のときの階乗の合計の下2桁: 13

実行結果からも確認できるように、N が 7 以降は答えが「13」で固定されており、N ≥ 10 で常に一定となる理論どおりの動作をしています。大きな N に対しても定数時間で答えを返せる点が、このアルゴリズムの大きな利点です。

  1. 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の倍数になるためです。したがっ

  2. Pythonで基数Kに変換した数値の桁の合計を求める方法

    問題の概要10進数(基数10)で表された数値 n と、別の基数 k が与えられたとします。このとき、n を基数10から基数 k に変換した後の各桁の合計を求める必要があります。桁の合計を計算する際には、各桁を通常の10進数として扱う点に注意してください。例えば、入力が n = 985、k = 8 の場合を考えてみましょう。985 を8進数に変換すると「1731」になります。したがって、桁の合計は 1 + 7 + 3 + 1 = 12 となります。解法のアルゴリズムこの問題は、基数変換の仕組みを利用することで簡単に解けます。手順は以下の通りです。答えを格納する変数 ans を 0 で初期化します