51Nod 2175 ProjectEuler 5 最小公倍數

1. 題目描述

1.1. Limit

Time Limit: 1000 ms

Memory Limit: 131072 kB

1.2. Problem Description

6是最小的,1到3所有數的倍數。

6=1×6=2×3=3×2 (6 = 1 \times 6 = 2 \times 3 = 3 \times 2)

2520是最小的,1到10的所有數字的倍數。

輸入nn,輸出最小的正整數,他是1到nn所有數的倍數。


1.3. Input

輸入第一行組數 TT,接下來 TT 行,每行一個整數nn

(1<=T<=20) (1 <= T <= 20)

(1<=N<=20) (1 <= N <= 20)


1.4. Output

對於每組數據,輸出一個數,表示1到n的最小公倍數。


1.5. Sample Input

3
3
10
20

1.6. Sample Output

6
2520
232792560

1.7. Source

51Nod 2175 ProjectEuler 5


2. 解讀

i=1i = 1 時,利用歐幾里德算法(輾轉相除法),求 iii+1i + 1 的最大公約數 gcdgcdi(i+1)i * (i + 1) 除以最大公約數 gcdgcd,即可得到兩個數的最小公倍數lcmlcm

i[3,n]i \in [3 , n] ,求 lcmlcmii 的最小公倍數,再賦值給 lcmlcm,遍歷完以後即可求得答案。

3. 代碼

#include <iostream>
#include <string.h>
using namespace std;

long long numList[20];

int gcd(long long a, long long b)
{
    return b == 0 ? a : gcd(b, a % b);
}

int main()
{
    long long n;
    // 讀入n
    scanf("%lld", &n);
    // 初始化數組
    memset(numList, 0, sizeof(numList));
    // 最大公約數buffer
    long long gcdBuffer = 0;
    // 最小公倍數buffer
    long long lcmBuffer = 0;
    // 讀入數組
    for (long long i = 0; i < n; i++) {
        // 輸入
        scanf("%lld", &numList[i]);
        if (numList[i] > 1) {
            // 輾轉相除法
            gcdBuffer = gcd(1, 2);
            // 求最小公倍數
            lcmBuffer = 1 * 2 / gcdBuffer;
            // 循環求最小公倍數
            for (long long j = 3; j <= numList[i]; j++) {
                // 輾轉相除法
                gcdBuffer = gcd(lcmBuffer, j);
                // 求最小公倍數
                lcmBuffer = j * lcmBuffer / gcdBuffer;
            }
            // 輸出
            printf("%lld\n", lcmBuffer);
        } else {
            // 輸出
            printf("%d\n", 1);
        }
    }
}

聯繫郵箱:[email protected]

Github:https://github.com/CurrenWong

歡迎轉載/Star/Fork,有問題歡迎通過郵箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章