数の因子の最小合計を求めるC++プログラムの解説
本記事では、ある整数を複数の因子(約数)の積に分解したとき、その因子の合計が最小となる値を求めるプログラムについて解説します。すべての因子の組み合わせを列挙して比較する必要があるように思えますが、実は素因数分解を利用することで、効率的に答えを求められます。
入力:n = 12 出力:7
考え方
まず数nの因子を見つけて合計を求め、その合計を最小化することを目指します。12の場合、因子への分解の仕方はいくつもあります。それぞれの分解方法と因子の合計は以下の通りです。
12 = 12 × 1 → 12 + 1 = 13 12 = 2 × 6 → 2 + 6 = 8 12 = 3 × 4 → 3 + 4 = 7 12 = 2 × 2 × 3 → 2 + 2 + 3 = 7 よって最小の合計は 7
ここで重要なのは、合成数の因子をさらに小さな因子へ分解しても、合計が増えることはないという点です。例えば「6」をひとつの因子とみなすよりも「2 × 3」に分解したほうが合計は小さくなります(6 → 5)。したがって、これ以上分割できない素因数まで分解したときの素因数の和こそが、求めるべき最小の合計になります。
実装例
#include<iostream>
using namespace std;
int main() {
int n = 12;
int sum = 0;
for (int i = 2; i * i <= n; i++) {
while (n % i == 0) {
sum += i;
n /= i;
}
}
sum += n;
cout << sum;
return 0;
}
コードの解説
このプログラムは素因数分解のアルゴリズムを利用しています。2から順に、√n以下の整数iでnを割り切れる限り割り続け、そのたびにiを合計に加算していきます。試し割りが終わった後に残ったnが1より大きければ、それは最後の素因数なので合計に加えます。
試し割りは√nまで確認すれば十分であるため、このアルゴリズムの計算量はO(√n)となります。すべての因子の組み合わせを総当たりで調べる方法と比べて、はるかに高速に動作するのが特徴です。
-
Pythonで数の偶数の約数の合計を求めるプログラムの実装方法
本記事では、以下の問題文に対する解決策について学びます。問題文整数 n が与えられたとき、その数の偶数の約数(偶因子)の合計を求めることが課題です。この問題を解くには、まず奇数の約数をすべて除外する必要があります。入力された数が奇数の場合、偶数の約数は一つも存在しないため、直接 0 を返します。そうでない場合は、以下のコードで示すアプローチに従います。アルゴリズムの考え方このアプローチでは素因数分解を活用します。約数の合計は「各素因数の冪乗の和の積」として表せるという性質を利用します。偶数の約数のみを対象とするため、素因数 2 の部分については 20(つまり 1)を除外し、21 以降の項だけを
-
Pythonで数の因子の最小合計を求めるプログラム|素因数分解の考え方
本記事では、与えられた整数について、積が元の数と等しくなる因子の組み合わせの中から合計が最小となる値を求める方法を、Pythonのコード例とともに解説します。 問題定義 入力として1つの整数が与えられます。この数を複数の因子の積として表したとき、因子の合計が最小になるケースを求めてください。 すべての因子の組み合わせを網羅的に調べて合計を比較する方法もありますが、実はもっとシンプルで効率的なアプローチが存在します。 考え方:素因数の合計が最小になる 鍵となるのは次の性質です。積が一定の値になるとき、因子の合計が最小になるのは、すべての因子を素数まで分解した場合(素因数分解した場合)です。