【模板题】【数论】最大公约数GCD最小公倍数LCM——一道例题,两道练习

本文介绍了一个计算两个正整数最大公约数(GCD)和最小公倍数(LCM)的C++程序,并通过两道练习题展示了如何应用这些概念解决实际问题。练习1旨在寻找两个数,其最大公约数为G,最小公倍数为L,且这两数之和最小。练习2则计算了以特定数值作为最大公约数和最小公倍数的数对的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【模板】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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值