文章目錄
1. 題目描述
1.1. Limit
Time Limit: 1000 ms
Memory Limit: 131072 kB
1.2. Problem Description
6是最小的,1到3所有數的倍數。
2520是最小的,1到10的所有數字的倍數。
輸入,輸出最小的正整數,他是1到所有數的倍數。
1.3. Input
輸入第一行組數 ,接下來 行,每行一個整數。
1.4. Output
對於每組數據,輸出一個數,表示1到n的最小公倍數。
1.5. Sample Input
3
3
10
20
1.6. Sample Output
6
2520
232792560
1.7. Source
2. 解讀
時,利用歐幾里德算法(輾轉相除法),求 和 的最大公約數 , 除以最大公約數 ,即可得到兩個數的最小公倍數。
對 ,求 和 的最小公倍數,再賦值給 ,遍歷完以後即可求得答案。
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,有問題歡迎通過郵箱交流。