c语言经典题讲解(求两数的最大公约数与最小公倍数)

题目描述:给定两个正整数m,n,求m,n的最大公约数与最小公倍数

greatest common divisor 最大公约数 (gcd)
least common multiple 最小公倍数 (lcm)

输入描述:两个正整数m,n

输出描述:两个正整数,分别为最大公约数与最小公倍数

辗转相除法(一)

#include <stdio.h>
unsigned long long gcd(unsigned long long m, unsigned long long n)
{ 
// 最大公约数
return n ? gcd(n, m % n) : m;
}
unsigned long long lcm(unsigned long long m, unsigned long long n)
{ 
// 求最小公倍数
return m * n / gcd(m, n);
}
int main()
{
unsigned long long m, n;
scanf("%llu %llu", &m, &n);
printf("%llu\n", lcm(m, n));
printf("%11u\n", gcd(m, n));
}

先确定精度,使用判断语句求出最大公约数,然后利用两者关系直接输出。

辗转相除法(二)

#include<stdio.h>
int main()
{
	int m , n , temp;
	scanf("%d %d",&m,&n);
	int k = m*n;
	while (m !=0 && n !=0)
	{
	temp = m % n;
	m = n;
	n = temp;
	}
	printf("gcd = %d\n",m);
	printf("lcm = %d\n",k/m);
}

也叫欧几里得算法,以两数相除取余,然后取较小两数以较大者向较小者取余,如此循环,直至最后余数为0时,循环结束。

更相减损术

#include<stdio.h>
int main()
{
	int m , n , temp;
	scanf("%d %d",&m,&n);
	int k = m*n;
	while (m * n !=0 && m != n)
	{
	
	if(m>n)
	{
		m = m -n;
	}
	else
	{
		n =  n - m;
	}
	}
	printf("gcd = %d\n",m);
	printf("lcm = %d\n",k/m);
}

更相减损术是由张苍,耿寿昌在《九章算术》中提出来的,即“可半者半之,不可半者,副置分母,子之数,以少减多,更相减损,求其等也。以等数约之。”翻译过来便是首先给定两个正整数,使其不全为偶数。然后,以较大者减较小的数,将差与两数比较,以最小两数中较大者减较小者,直至所得的减数和差相等为止。即得最小公约数。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌暴龙战士16

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值