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

C++で階乗(n!)の各桁の合計を求める方法

問題の概要

ある整数 n が与えられたとき、n の階乗(n!)における各桁の数字の合計を求めることが課題です。例として n = 5 を考えてみましょう。この場合、n! = 120 となるので、1 + 2 + 0 = 3 が答えになります。

解法のアプローチ

階乗の値は n が大きくなるほど爆発的に増加するため、通常の整数型では表現できません。そこで、階乗の各桁を vector に1桁ずつ格納する手法を用います。これは筆算と同じ要領で、繰り上がりを処理しながら掛け算を繰り返す方法です。

  1. 階乗の各桁を保存するための vector を作成し、初期値として 1 を入れておきます。
  2. 1 から n までの各数値を順番に vector 全体へ掛けます。各桁ごとに「現在の桁 × 掛ける数 + 繰り上がり」を計算し、10 で割った余りを新しい桁の値とします。
  3. すべての掛け算が完了したら、vector 内の全要素を足し合わせて返します。

C++による実装例

#include<iostream>
#include<vector>
using namespace std;

// vector に格納された多倍長整数に x を掛ける関数
void vectorMultiply(vector<int> &v, int x) {
    int carry = 0, res;
    int size = v.size();
    for (int i = 0; i < size; i++) {
        res = carry + v[i] * x;
        v[i] = res % 10;
        carry = res / 10;
    }
    while (carry != 0) {
        v.push_back(carry % 10);
        carry /= 10;
    }
}

// n! の各桁の合計を求める関数
int digitSumOfFact(int n) {
    vector<int> v;
    v.push_back(1);
    for (int i = 1; i <= n; i++)
        vectorMultiply(v, i);
    int sum = 0;
    int size = v.size();
    for (int i = 0; i < size; i++)
        sum += v[i];
    return sum;
}

int main() {
    int n = 40;
    cout << n << "! の各桁の合計は: " << digitSumOfFact(n);
    return 0;
}

出力結果

40! の各桁の合計は: 189

コードのポイント

  • vectorMultiply 関数: vector に格納された巨大な数に対して、下位の桁から順に x を掛け、繰り上がり(carry)を管理します。計算後に残った繰り上がりは、新たな桁として vector の末尾に追加されます。
  • digitSumOfFact 関数: 初期値 1 から始めて、1 から n まで順番に掛けていくことで n! を構築し、その後すべての桁を合計して返します。

このプログラムでは n = 40 を計算しています。40! は 48 桁にも及ぶ巨大な数ですが、vector で各桁を管理することでオーバーフローを心配することなく、正確な桁の合計である 189 を求められます。同じ手法は 100! のようなさらに大きな階乗にもそのまま適用できます。

  1. C++を使って「数x + xの桁の合計 = n」となる数xを求める方法

    ここでは、ある数nが与えられたとき、「数xとその桁の合計を足した値がnと等しくなる」ようなxを求める問題を扱います。例えば、nが21の場合、答えはx = 15となります。15の桁の合計は1 + 5 = 6なので、15 + 6 = 21 = nとなり、条件を満たすからです。この問題を解くには、シンプルなアプローチが有効です。0からnまでの数を順番に調べていき、各数値について「その数 + 桁の合計」がnと一致するかどうかを確認します。一致する数が見つかった時点でその値を返し、最後まで見つからなければ-1を返します。サンプルコード#include<iostream> using name

  2. C++で「x + 桁の合計 = n」を満たす数xを見つける方法

    この記事では、ある整数 n が与えられたとき、「x + x の各桁の合計 = n」という条件を満たす数 x を求める問題を解説します。例として、n = 21 の場合を考えてみましょう。このとき答えは x = 15 となります。なぜなら、15 の各桁の合計は 1 + 5 = 6 であり、15 + 6 = 21 となって、与えられた n と一致するからです。解き方のアプローチこの問題はシンプルな方法で解くことができます。1 から n まで順番に数を調べていき、それぞれの数について「その数自身 + 各桁の合計」が n と等しくなるかどうかを確認します。条件を満たす数が見つかった時点で処理を終了し、そ