求最小公倍数跟最大公约数问题
2015-01-16 14:55
337 查看
求最大公约数(辗转相除法)
下面是求两个数的最大公约数和最小公倍数
设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)
#include <iostream>
#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;
}
下面是求两个数的最大公约数和最小公倍数
设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)
#include <iostream>
#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;
}
相关文章推荐
- 【GCD|LCM】最大公约数和最小公倍数问题 WIKIOI1012
- WikiOI 1012 最大公约数和最小公倍数问题
- CODEVS 1012 最大公约数和最小公倍数问题
- noip2001 最大公约数和最小公倍数问题 (质因数分解)
- 洛谷1029 最大公约数和最小公倍数问题 解题报告
- 【数论 / 数值】【RQNOJ】最大公约数和最小公倍数问题
- Tsinsen A1131 最大公约数和最小公倍数问题
- 1012 最大公约数和最小公倍数问题
- 求最大公约数和最小公倍数引发的一些问题
- 1012 最大公约数和最小公倍数问题
- 天梯 1012 最大公约数和最小公倍数问题
- 【模拟】【数论】最大公约数和最小公倍数问题
- wikioi1012 最大公约数和最小公倍数问题(2001年NOIP全国联赛普及组)
- 【数论】【最大公约数】【枚举约数】CODEVS 1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组
- 最大公约数和最小公倍数问题
- WIKIOI – 1012 最大公约数和最小公倍数问题
- wikioi p1012 最大公约数和最小公倍数问题
- NOIP2001普及组 最大公约数和最小公倍数问题
- 1012 最大公约数和最小公倍数问题
- 【转】【数论】【codevs】1012 最大公约数和最小公倍数问题