最近在TC上做了一道题,才发现自己求最大公约数的程序都忘记了,汗颜。
GCD采用辗转相除法,就是求a,b两个数的最大公约数,等于求a与a%b的最大公约数,这样,就可以将大的数据减小。那么什么时候结束呢,当a%b==0时,就说明,此时已经没有办法再将两个数的值变小了,此时b就是所求的最大公约数。
很多人,喜欢先将a,b两个值比较一下,然后,用max%min,当然也可以不用比较,只需要while(b!=0){ c=a ; a=b; b=c%a}即可,最后将a返回;
int gcd(int a,int b)
{
while(b != 0)
{
int c = a;
a = b;
b = c % a;
}
return a;
}
要求最小公倍数,就要先借助最大公约数来求,最小公倍数的值为a*b/gcd(a,b);
若是,多于两个数,那么,最小公倍数的求法就是前两个数的最小公倍数与第三个数的最小公倍数,以此类推;
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
using namespace std;
int gcd(int a,int b)
{
while(b!=0)
{
int c = a;
a = b;
b = c % a;
}
return a;
}
int main()
{
int N;
scanf("%d",&N);
std::vector<int > v;
for (int i = 0; i < N; ++i)
{
int tmp;
scanf("%d",&tmp);
v.push_back(tmp);
}
int lcm = 1;
for (int i = 0; i < v.size(); ++i)
{
lcm = (lcm * v[i])/gcd(lcm,v[i]);
}
printf("%d\n",lcm);
system("pause");
return 0;
}