题意就是求一个数列的最小公倍数,使用欧几里德算法
递归代码
#include <iostream>
#include <cmath>
using namespace std;
__int64 data[1024];
//欧几里德算法求两个数的最大公约数
__int64 gcd(__int64 a, __int64 b)
{
if (b == 0)
{
return a;
}
else
{
return gcd(b, a % b);
}
}
__int64 lcm(__int64 a, __int64 b)
{
return a / gcd(a, b) * b; //先除法在乘法可以防止溢出
}
__int64 nlcm(__int64 * a, int n)
{
if (n == 1)
{
return *a;
}
else
{
return lcm(a[n - 1], nlcm(a, n - 1));//递归
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
int num;
cin >> num;
for (int i = 0; i < num; i++)
{
scanf("%I64d", &data[i]);
}
printf("%I64d\n", nlcm(data, num));
}
return 0;
}