习题4-7 最大公约数和最小公倍数(辗转相除法)

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(≤1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

法一:直接翻译最小公倍数和最大公约数的数学意思。

#include <stdio.h>

int main(void) {
	int M, N;
	
	scanf("%d %d", &M, &N);
	printf("%d %d", f1(M, N), f2(M, N));
	
	return 0;
}

/*最大公约数:m除以这个数余0,n除以这个数也余0,且是公因子中最大的*/
int f1(int m, int n) {
	int i, min;
	
	min = m > n ? n : m;    //若m比n大,取n,否则取m.
	for (i = min; i > 0; i--)    //因为是寻找最大公因子所以用--
		if (n % i == 0 && m % i == 0) 
		    return i;
}

/*最小公倍数:这个数既是m的倍数,也是n的倍数,且是倍数中最小的*/
int f2(int m, int n) {
	int i, max, min, ret;
	
	max = m > n ? m : n;
	min = m > n ? n : m;
	for (i = 1; ;i++)
		if (min * i % max == 0)
			return min * i;
}

 

法二:辗转相除法

  1. 找到较大数、较小数。
  2. 大数对小数求余。
  3. 小数赋给大数。
  4. 余数赋给小数。
/*辗转相除法*/
int f1( int m, int n ) {
	int i, min, max, remainder, ret;
	
	min = m > n ? n : m;
	max = m > n ? m : n;
	while ( min ) {    //直到小数等于0,退出循环。
		remainder = max % min;    //大数对小数求余。
		max = min;    //小数赋给大数。
		min = remainder;    //余数赋给小数。
	}
	ret = max;    //最大公约数。
		
	return ret;
}

 

合并在一起的代码:

#include <stdio.h>

int main(void) {
	int M, N, max, min, i;
	
	scanf("%d %d", &M, &N);
	max = M > N ? M : N;
	min = M > N ? N : M;
	for (i = min; i > 0; i--)
		if (max % i == 0 && min % i == 0) {
			printf("%d", i);
			break;
		}
	for (i = 1; ; i++)
		if (min * i % max == 0) {
			printf(" %d", min * i);
			break;
		}
	
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值