求最大公约数(辗转相除法)
下面是求两个数的最大公约数和最小公倍数
设a=qb+r,其中,a,b,q,r都是整数,则 gcd(a,b)=gcd(b,r)
int gcd(int a, int b)
{
int x,y,r;
x = max(a,b);
y = min(a,b);
r = x%y;
while(r)
{
x = y;
y = r;
r = x%y;
}
return y;
}
求最小公倍数
算法1:用下面定理
定理(最大公约数与最小公倍数关系定理):设a,b是两个正 整数,则gcd(a,b)lcm(a,b)=ab;
#include <iostream>
#define min(x,y) x<y?x:y;
#define max(x,y) x>y?x:y;
using namespace std;
int gcd(int a, int b)
{
int x,y,r;
x = max(a,b);
y = min(a,b);
r = x%y;
while(r)
{
x = y;
y = r;
r = x%y;
}
return y;
}
int main()
{
int a,b;
while (cin >> a >> b && a && b)
{
cout << a*b/gcd(a,b) << endl;
}
return 0;
}
算法2:利用下面思路
(1)k=max(a,b)
(2)如果a|k,b|k,则k是 a,b的最小公倍数,否则转下步
(3) k=k+k,转(2)
#define min(x,y) x<y?x:y;
using namespace std;
int main()
{
int a,b;
int k,m;
while (cin >> a >> b && a && b)
{
m = k = min(a,b);
while (1)
{
if (m%a == 0 && m%b == 0)
{
break;
}
else
{
m += k;
}
}
cout << m << endl;
}
return 0;
}
要求多个数的最小公倍数跟最大公约数,其实很简单,只要用一个循环,将前两个数的最小公倍数(最大公约数)求出得num,再将num与下一个数继续求最小公倍数(最大公约数),直到把所有的数都遍历一遍,下面给个简单的例子,你可举一反三。
#include <iostream>
#define min(x,y) x<y?x:y;
#define max(x,y) x>y?x:y;
int a[100];//存放目标数
using namespace std;
int gcd(int a, int b)
{
int x,y,r;
x = max(a,b);
y = min(a,b);
r = x%y;
while(r)
{
x = y;
y = r;
r = x%y;
}
return y;
}
int main()
{
int n;
int k;
while (cin >> n && n)
{
k = 1;//k用来暂时存放前两个数的最小公倍数
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <=n; i++)
{
k = a[i]*k/gcd(a[i],k);//不断与后面的数求最小公倍数
}
cout << k << endl;
}
return 0;
}