求两个数最大公约数(C语言实现)

求最大公约数(C语言实现)

0、暴力穷举法

暴力穷举是最不推荐的算法,因为他的时间复杂度是最高的

int GCD(int a, int b) {
    if(a < b) {
		int c = a;
		a = b;
		b = c;
	}
    
	for(int i=b; i>0; i--) {
        if (a % i == 0 && b % i == 0) return i;
    }
    return 1;
}

一、辗转相减法

int GCD(int a, int b) {
    while (a != b) {
        if (a > b) a -= b;
        else b -= a;
    }
    return a;
}

二、更相减损术

更相减损法来自《秦九昭算数》,与辗转相减法的区别在于先把两个值置为奇数

int GCD(int a, int b) {	
	while(a%2==0) {
		a/=2;
	}
	while(b%2==0) {
		b/=2;
	}              
	while(a!=b) {
		if(a>b) a=a-b;               
		else b=b-a;             
	}
    return a;
}

三、辗转相除法

递归法又叫欧几里得算法,计算公式gcd(a,b) = gcd(b,a mod b)

int GCD(int a, int b) {
    int c;
    if(a < b) {
		c = a;
		a = b;
		b = c;
	}
	while(b != 0) {	
		c = b;
		b = a % b;            
		a = c;
	}
    return a;
}

四、递归法

递归法本质上还是辗转相除法

int GCD(int a,int b) {
	if(a > b) {
		if(a % b == 0) return b;
		else return GCD(b,a%b);    
	}
	else {
		if(b % a == 0) return a;
		else return GCD(a,b%a);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LyaJpunov

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

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

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

打赏作者

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

抵扣说明:

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

余额充值