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

C++で数の約数の積を求めるアルゴリズム


ある整数 n が与えられたとき、そのすべての約数を求め、それらの積を計算して結果として返すことを考えます。これが「数の約数の積を求める」という問題です。約数とは、その数を余りなく割り切ることができる数(1 を含む)のことです。たとえば、6 の約数は 1、2、3、6 です。

このタスクでは、与えられた数のすべての約数を掛け合わせた値を求めます。

入力例と出力例

入力 − n = 18
出力 − 5832
説明 − 1 × 2 × 3 × 6 × 9 × 18 = 5832

入力 − n = 9
出力 − 27
説明 − 1 × 3 × 9 = 27

問題を解くためのアプローチ

すべての約数を愚直に全探索すると O(n) の計算量が必要ですが、約数はペア(小さい方と大きい方)で現れる性質を利用すると、O(√n) で効率的に求められます。手順は以下の通りです。

  • 入力として num を受け取ります。

  • i = 1 から i * i <= num となるまでループします。

  • num % i == 0(つまり i が約数)であるかを判定し、次のように処理します。

    • num / i == i の場合(i が平方根に相当する約数)、二重カウントを避けるため product = (product * i) % MAX のみを行います。

    • それ以外の場合は、product = (product * i) % MAX とし、さらに product = (product * num / i) % MAX として、ペアになるもう一方の約数も掛け合わせます。

  • 最後に product を返します。

アルゴリズム

開始
関数 long long productfactor(int num)
    ステップ 1 → product を宣言し、1 で初期化する
    ステップ 2 → i = 1 から i * i <= num の間、i を増やしながら繰り返す
        もし num % i == 0 ならば、
            もし num / i == i ならば、
                product を (product * i) % MAX に設定する
            そうでなければ、
                product を (product * i) % MAX に設定する
                product を (product * num / i) % MAX に設定する
    ステップ 3 → product を返す
関数 int main()
    ステップ 1 → n を宣言し、9 で初期化する
    ステップ 2 → productfactor(n) の結果を出力する
終了

実装例

#include <stdio.h>
#define MAX 1000000000
// 約数の積を求める
long long productfactor(int num){
    long long product = 1;
    for (int i = 1; i * i <= num; i++){
        if (num % i == 0){
            // 同じ約数は一度だけ掛ける(平方数の場合の対策)
            if (num / i == i)
            product = (product * i) % MAX;
            // そうでなければ両方の約数を掛ける
            else {
                product = (product * i) % MAX;
                product = (product * num / i) % MAX;
            }
        }
    }
    return product;
}
int main(){
    int n = 9;
    printf("%lld\n", productfactor(n));
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

27

このように、ループを √num までに限定することで、大きな数に対しても高速に約数の積を計算できます。なお、積が非常に大きくなる可能性があるため、オーバーフロー防止のために各ステップで MAX による剰余を取っている点にも注目してください。

  1. C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】

    この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具

  2. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の