C语言 · 最大公约数与最小公倍数求解【各类方法集合】 7-1

什么是最大公约数?

a b 的最大公约数是gcd:

即:可以同时被a 和b 整除的数

a % gcd == 0 && b % gcd ==0

a 和b 中可以模的尽的最大值  ==>  gcd    是符合上述条件的最大值

什么是最小公倍数?

a b 的最小公倍数是lcm

即: lcm % a ==0 &&  lcm % b ==0

a 和b 中可以模的尽的最小值  ==>  lcm是符合上述条件的最小值

最大公约数算法

方法一: 穷尽法

a b (b 为小值)

1、先找出两个数中的最小值b, 让另一个数字a除以它,如果除的尽,小的数就是最大公约数,(小的数自己出自己肯定除的尽);

2、若除不尽,b-- ,减到可以除尽,最坏的情况是b减为1

24  15 

用24 %15

//穷举法!
int gcd(int a, int b) {

	if (a == 0)
		return b;
	else if (b == 0)
		return a;
	else if (a == b)
		return a;
	else {
		//穷举法:
		int gcd_res = a > b ? b : a; 			//找出a和b中的小值
		while (gcd_res < 1) { 				 //1 一定可以被整除,1为最坏的时候
			if (gcd_res % a == 0 && gcd_res % b == 0) {
				return gcd_res;
				break;
			} else
				gcd_res--;
		}
	}
}

方法二: 相减法

int gcd(int a, int b) {

	if (a == 0)
		return b;
	else if (b == 0)
		return a;
	else if (a == b)
		return a;
	else {
		//相减法:
		int gcd_res;
		while (a != b)
			gcd_res = a > b ? (a -= b) : (b -= a); 			//找出a和b中的小值
		return gcd_res;
	}

}

方法三:

辗转相除法

 代码:


//辗转相除法
int gcd(int a, int b) {

	if (a == 0)
		return b;
	else if (b == 0)
		return a;
	else if (a == b)
		return a;
	else {
		//辗转相除法:
		int mod = a % b;
		while (mod) {
			a = b;
			b = mod;
			mod = a % b;
		}
		return b;
	}

}

 

方法四:辗转相除法的递归实现

//辗转相除法的递归实现
int gcd(int a, int b) {

	if (b == 0)
		return a;
	else {
		return gcd(b, a % b);
	}
}

错误: 没有给 a ,b 赋值

改为

gcd_res = a > b ? (a -= b) : (b -= a); 	

最小公倍数算法

方法一:穷举法

a   b 

找出a 与 b 中的最大值如a为最大值

int x  = a;

再看a  b 是否可以同时被x 除尽

否则 x++

若a  b 中有0,则最大公约数为0

//穷举法:
int lcm(int a, int b) {
	if (a * b == 0)
		return 0;
	else {
		int lcm = a > b ? a : b;
		while (1) {
			if (lcm % a == 0 && lcm % b == 0)
				break;
			else
				lcm++;
		}
		return lcm;
	}
}

整体代码为:

#include <stdio.h>

//穷举法:
int lcm(int a, int b) {
	if (a * b == 0)
		return 0;
	else {
		int lcm = a > b ? a : b;
		while (1) {
			if (lcm % a == 0 && lcm % b == 0)
				break;
			else
				lcm++;
		}
		return lcm;
	}
}


/*

//辗转相除法的递归实现
int gcd(int a, int b) {

	if (b == 0)
		return a;
	else {
		return gcd(b, a % b);
	}
}
*/



//辗转相除法
int gcd(int a, int b) {

	if (a == 0)
		return b;
	else if (b == 0)
		return a;
	else if (a == b)
		return a;
	else {
		//辗转相除法:
		int mod = a % b;
		while (mod) {
			a = b;
			b = mod;
			mod = a % b;
		}
		return b;
	}

}


/*


//相减法
int gcd(int a, int b) {

	if (a == 0)
		return b;
	else if (b == 0)
		return a;
	else if (a == b)
		return a;
	else {
		//相减法:
		int gcd_res;
		while (a != b)
			gcd_res = a > b ? (a -= b) : (b -= a); 			//找出a和b中的小值
		return gcd_res;
	}

}
*/


/*

//穷举法!
int gcd(int a, int b) {

	if (a == 0)
		return b;
	else if (b == 0)
		return a;
	else if (a == b)
		return a;
	else {
		//穷举法:
		int gcd_res = a > b ? b : a; 			//找出a和b中的小值
		while (gcd_res < 1) { 				 //1 一定可以被整除,1为最坏的时候
			if (gcd_res % a == 0 && gcd_res % b == 0) {
				return gcd_res;
				break;
			} else
				gcd_res--;
		}
	}
}
*/


int main() {

	int a = 0, b = 0;
	printf("请输入a,b \n");
	scanf("%d%d", &a, &b);

//	int gcd_res = gcd(a, b);
//	printf("%d 和%d 最大公约数:%d", a, b, gcd_res);

	int lcm_res = lcm(a, b);
	printf("%d 和%d 最小公倍数:%d", a, b, lcm_res);

	return 0;

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值