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

【C++】ある数の偶数の素因数の合計を効率的に求める方法

はじめに

この記事では、ある整数の「偶数の素因数」の合計を効率的に求める方法を解説します。例として、n = 480 という数を考えてみましょう。480 を素因数分解すると、2、2、2、2、2、3、5 となります。このうち偶数である素因数は 2 のみなので、その合計は 2+2+2+2+2 = 10 になります。

一見すると、すべての因数を列挙して偶数かどうか判定する必要があるように思えますが、実はもっとシンプルな方法で解けます。

解法のポイント

偶数の素因数は 2 しか存在しない、という点が重要です。これを利用すると、次の手順で問題を解くことができます。

  • 数が 2 で割り切れる間、そのたびに合計に 2 を加算し、数を 2 で割っていく。
  • 2 で割り切れなくなった時点で、その数は必ず奇数になっているため、以降に偶数の因数は現れない。したがって、残りの因数(3 や 5 など)はすべて無視してよい。

この方法なら、処理時間は 2 で割れる回数に比例するだけなので、非常に高速です(計算量は O(log n))。

アルゴリズム

begin
    sum := 0
    n が 2 で割り切れる間、繰り返す
        sum := sum + 2
        n := n / 2
    done
end

C++での実装例

#include<iostream>
using namespace std;

int sumEvenFactors(int n){
    int i, sum = 0;
    while(n % 2 == 0){
        sum += 2;
        n = n / 2; // 2で割って数を小さくしていく
    }
    return sum;
}

int main() {
    int n;
    cout << "Enter a number: ";
    cin >> n;
    cout << "Sum of all even prime factors: "<< sumEvenFactors(n);
}

実行結果

Enter a number: 480
Sum of all even prime factors: 10

まとめ

偶数の素因数は 2 のみであることを利用すれば、数を 2 で割り続けるだけで偶数の素因数の合計を簡単に求められます。全因数を探索するアプローチと比べて計算量が大幅に少なく、大きな数でも高速に動作する実用的な手法です。

  1. Pythonプログラムで数の偶数の約数の合計を求める方法

    この記事では、以下の問題文に対する解決策について詳しく解説します。 問題文:ある数が与えられたとき、その数のすべての偶数の約数(因子)の合計を求めて表示します。 アプローチ まず、与えられた数が奇数であるかどうかを確認します。奇数には偶数の約数が存在しないため、その場合は 0 を返します。 数が偶数である場合は、実際の計算に進みます。ここでのポイントは、20(つまり1)以外のすべての項を掛け合わせることで、偶数の約数の合計が得られるという点です。 偶数の約数からすべての奇数を取り除くために、20 に相当する「1」を無視します。この処理を行うことで、残るのは偶数の約数のみとなります。なお、2 は

  2. Pythonで数の偶数の約数の合計を求めるプログラムの実装方法

    本記事では、以下の問題文に対する解決策について学びます。問題文整数 n が与えられたとき、その数の偶数の約数(偶因子)の合計を求めることが課題です。この問題を解くには、まず奇数の約数をすべて除外する必要があります。入力された数が奇数の場合、偶数の約数は一つも存在しないため、直接 0 を返します。そうでない場合は、以下のコードで示すアプローチに従います。アルゴリズムの考え方このアプローチでは素因数分解を活用します。約数の合計は「各素因数の冪乗の和の積」として表せるという性質を利用します。偶数の約数のみを対象とするため、素因数 2 の部分については 20(つまり 1)を除外し、21 以降の項だけを