【模板】7592:求最大公约数问题
#include<iostream>
#include<algorithm>
using namespace std;
int GCD(int a,int b)
{
if (a<b)
swap(a,b);
if (b==0) return a;
else return GCD(a%b,b);
}
int main()
{
int a,b;
cin>>a>>b;
cout<<GCD(a,b);
return 0;
}
最小公倍数LCM=a*b/GCD(a,b)
练习1:7828:最大公约数与最小公倍数:两个正整数的最大公约数是G,最小公倍数是L,它们的和最小是多少?
思路:和最小,则a和b的差理应最小。从sqrt(G*L)开始遍历a,一旦找到立马跳出。
注意:不能用j%g==0来判断,可能g不是i和j的最小公约数。所以必须用GCD判断!!!
#include<iostream>
#include<algorithm>
using namespace std;
int GCD(int a,int b)
{
if (a<b) swap(a,b);//必不可少!
if (b==0) return a;
else return GCD(a%b,b);
}
int main()
{
int i,j,g,l,s,m=1<<27;
cin>>g>>l;
s=g*l;
i=sqrt(s)+1;
while(i>=1)
{
j=s/i;
if (s%i==0 && GCD(i,j)==g && (i*j/GCD(i,j))==l)
{
m=i+j;
break;
}
else i--;
}
cout<<m<<endl;
return 0;
}
练习2:8784:最大公约数和最小公倍数问题:求以x0为最大公约数,以y0为最小公倍数的数的对数
#include<iostream>
#include<algorithm>
using namespace std;
int GCD(int a,int b)
{
if (a<b) swap(a,b);
if (b==0) return a;
else return GCD(a%b,b);
}
int main()
{
int x,y,a,b,ans=0;
cin>>x>>y;
for (a=x;a<=y;a++)
{
b=y*x/a;
if (y%a==0 && GCD(a,b)==x && (a*b/GCD(a,b))==y )
ans++;
}
cout<<ans;
return 0;
}