C++で数の奇数の素因数の合計を効率的に求める方法
この記事では、ある数の奇数の素因数すべての合計を、効率的に求める方法を解説します。例として n = 1092 という数を考えてみましょう。1092 を素因数分解すると 2 × 2 × 3 × 7 × 13 となり、このうち奇数の素因数は 3、7、13 です。したがって、奇数の素因数の合計は 3 + 7 + 13 = 23 となります。
この問題を解くためには、以下のルールに従います。
- 数が 2 で割り切れる間は、その因数を無視して、数を 2 で繰り返し割ります。
- この時点で数は必ず奇数になっています。3 から数の平方根までの範囲で、現在の値 i で割り切れる場合は、その因数を合計に加算し、数を i で割って処理を続けます。
- 最後に、残った数が 2 より大きい奇数であれば、それ自体が素因数であるため、合計に加算します。
より理解を深めるために、アルゴリズムを確認してみましょう。
アルゴリズム
printPrimeFactors(n):
begin
sum := 0
while n is divisible by 2, do
n := n / 2
done
for i := 3 to √n, increase i by 2, do
while n is divisible by i, do
sum := sum + i
n := n / i
done
done
if n > 2, then
if n is odd, then
sum := sum + n
end if
end if
end
C++での実装例
#include<iostream>
#include<cmath>
using namespace std;
int sumOddFactors(int n){
int i, sum = 0;
while(n % 2 == 0){
n = n/2; //2で割って数を小さくしていく
}
//ここで数は2で割り切れなくなるため、残りの因数はすべて奇数
for(i = 3; i <= sqrt(n); i=i+2){ //iを2ずつ増やし、奇数のみを試す
while(n % i == 0){
sum += i;
n = n/i;
}
}
if(n > 2){
if(n%2 == 1)
sum += n;
}
return sum;
}
main() {
int n;
cout << "Enter a number: ";
cin >> n;
cout <<"Sum of all odd prime factors: "<< sumOddFactors(n);
}
実行結果
Enter a number: 1092
Sum of all odd prime factors: 23
コードのポイント
- 最初に n を 2 で割り切れなくなるまで割ることで、偶数の因数をすべて除外します。これにより、以降の処理では奇数の因数だけを考慮すればよくなります。
- ループでは i を 2 ずつ増加させることで、奇数のみを効率的に試します。
- ループ終了後に残った n が 2 より大きい場合、それは平方根以下に因数を持たない素数であるため、合計に加算します。
このアルゴリズムの計算量は O(√n) です。1 から順にすべての数で割り切れるかを調べる O(n) の方法と比べて大幅に高速であり、大きな数を扱う場合に特に有効です。
-
C++で数の奇数の約数(奇因子)の合計を求めるプログラム
正の整数が与えられたとき、その数の奇数の約数(奇因子)をすべて求め、それらの合計を計算するのが本プログラムの目的です。 例 入力: number = 20 出力: 奇数の約数の合計は: 6 入力: number = 18 出力: 奇数の約数の合計は: 13 例えば number = 20 の場合、約数は 1, 2, 4, 5, 10, 20 ですが、このうち奇数は 1 と 5 のみです。したがって、結果 = 1 + 5 = 6 となります。 プログラムで使用するアプローチ 奇数の約数の合計を計算する対象の数を入力する 偶数の約数を除外するため、まず数を2で割り切れる限り2で割り続け、奇数の部
-
Pythonで数の奇数の約数(奇因子)の合計を求めるプログラム
この記事では、「整数 n が与えられたとき、その数の奇数の約数(奇因子)の合計を求める」という問題の解き方を解説します。 問題文 整数 n が入力として与えられます。求めるのは、n の奇数の約数をすべて足し合わせた値です。 例えば n = 27 の場合、約数は 1, 3, 9, 27 のすべてが奇数であるため、合計は 1 + 3 + 9 + 27 = 40 となります。 アプローチのポイント この問題で最初に行うべきは、偶数の約数をすべて除外することです。 偶数の約数を取り除くには、n が 2 で割り切れなくなるまで繰り返し 2 で割ります。この操作によって n から 2 の因数が完全に