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