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,有问题欢迎通过邮箱交流。

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