【プロジェクトオイラー問題5】最小倍数

問題 5 最小倍数

2520 は、1 から 10 までの各数字で余りを残さずに割ることができる最小の数です。
1 から 20 までのすべての数で割り切れる最小の正の数は何ですか?

質問 5 最小公倍数

2520 は、1 から 10 までのすべての数値で余りを持たずに割り算できる最小の数です。
1 から 20 までのすべての数字で割り切れる最小の正の数は何ですか?

理論上のポイント

最小公倍数

百科事典の説明を引用すると、

2 つ以上の整数の公倍数を公倍数といい、これらの整数の 0 以外の最小公倍数を最小公倍数といい
ます_bの最小公倍数は [ a , b ] [a,b]として記録されます。[ _b ]、同様に、a 、 b 、 ca、b、c_b cの最小公倍数は [ a , b , c ] [a,b,c]として記録されます。[ _b c ]、複数の整数の最小公倍数も同じ表記になります

では、最小公倍数を計算するにはどうすればよいでしょうか?

まず、これらの数値の素因数を書き留めます。最小公倍数は、すべての素因数の積に等しいです (同じ素因数が複数ある場合は、2 つの数値のうちどちらの数値がより多くの素因数を持っているかを比較し、乗算します)複数回)

例えば:

最大公約数

最大公約数、a、ba、b_bの最大公約数は (a, b) (a,b)として記録されます。( _b )

つまり、共通因数が見つからなくなるまで短い割り算をして共通因数を見つけます。左辺の共通因数の積が最大公約数になります。

最大公約数と最小公倍数の関係

2 つの数値の積は、最大公約数と最小公倍数の積に等しい

a、ba、b という2 つの数がある場合_b、それらの最大公約数はppp、最小公倍数はqqq

それで

a × b = p × q \large a×b=p×qある×b=p×q

この式は次のように書き換えることができます

a × b = gcd ( a , b ) × q \large a×b=gcd\left (a,b \right)×qある×b=g c d( _b )×q

次に、最小公倍数を計算する式を与えます。

lcm ( a , b ) = abgcd ( a , b ) = q \large lcm(a,b)=\frac{ab}{gcd(a,b)}=ql cm ( a , _b )=g c d ( a ,b )a b=q

ユークリッドアルゴリズム

ユークリッド除算法とも呼ばれ、2 つの非負の整数a、ba、bを計算するために使用されます。_bの最大公約数

  • 大きい数を小さい数で割る
  • 余り(最初の余り)から除数を引いた値
  • 次に、最初の余りを残りの余り (2 番目の余り) で割ります。
  • 最終的な余りが 0 になるまで繰り返します。2 つの数値の最大公約数が必要な場合、最終的な約数は 2 つの数値の最大公約数になります。

計算式

gcd ( a , b ) \large gcd\left (a,b \right)g c d( _b )

アイデア分析

ユークリッドアルゴリズムの計算式に従い、2つの数の最大公約数を計算し、最小公倍数計算式により最小公倍数を求めます。次に、2 つの数値の最小公倍数と 3 番目の数値の最小公倍数を計算させ、繰り返し計算します。

コード

/*
 * @Author: coder-jason
 * @Date: 2022-04-11 14:08:31
 * @LastEditTime: 2022-04-11 14:59:47
 */
#include <iostream>
using namespace std;

typedef long long variable; // 定义类型别名

variable gcd(variable a, variable b) // gcd 实现
{
    
    
    return b>0 ? gcd(b, a % b) : a;
}

int main()
{
    
    
    variable ans = 1;
    for (int i = 2; i <= 20; i++)
    {
    
    
        ans = ans * i / gcd(ans, i);
    }
    cout << ans << endl;
    return 0;
}

答え: 232792560

おすすめ

転載: blog.csdn.net/m0_51269961/article/details/124097977