两个数的最大公约数利用辗转相除法可以得到, 最小公倍数为乘积除以最大公约数。
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
//返回两个数的最大公约数
uint64_t gcd(uint64_t a, uint64_t b)
{
uint64_t tmp = b;
//辗转相除法
while ( b != 0 )
{
tmp = b;
b = a % b;
a = tmp;
}
return a;
}
uint64_t lcm(uint64_t a, uint64_t b)
{
if ( a == 0 || b == 0 )
{
return a > b ? a : b;
}
return a * b / gcd(a, b);
}
uint64_t resolveP5(const vector<uint32_t> &ivec)
{
if ( ivec.empty() )
{
return 0;
}
uint64_t result = 1;
for(vector<uint32_t>::const_iterator it = ivec.begin(); it != ivec.end(); ++it)
{
result = lcm(result, *it);
cout << "*it=" << *it << ", result=" << result << endl;
}
return result;
}
int main()
{
vector<uint32_t> ivec;
for(uint32_t i = 1; i <= 20; ++i)
{
ivec.push_back(i);
}
uint64_t result = resolveP5(ivec);
//uint32_t result = gcd(5, 15);
cout << "result=" << result << endl;
return 0;
}