关注

C语言—求最大公约数(4种算法思路)

1.穷举法

如果大数可以整除小数,那么最大公约数为小数。如果不能整除小数,那么这两个数就按大到小依次对比小数小的数求余,遇到都能够整除的,就是最大公约数。

int gcd(int a, int b)
{
	int i;
	int min = a < b ? a : b;
	for (i = min; i >= 1; i--)
	{
		if (a % i == 0 && b % i == 0) 
            break;
	}
	return i;
}

2.辗转相除法

用a对b求余,若余数为0,则除数b为最大公约数。若余数不为0,将此余数r作为新的除数,b作为新的被除数,重新求余,直到余数为0为止。此时的最大公约数为除数。

a.常规辗转

int gcd(int a, int b)
{
	int t;
	while(a % b)//当a%b为0时,跳出循环,最大公约数为b
	{
		t = a % b;
		a = b;
		b = t;
	}
	return b;
}

b.递归辗转

int gcd(int a, int b)
{
	int r = a % b;
	if (0 == r)
		return b;//当余数为0时,b就为最大公约数
	else
		return gcd(b, r);
}

3.更相减损法

当两个数相等时,最大公约数为他们其中任意一个;当两个数不相等时,用大数减小数得到的差和之前的那个小数再次相减,直到两个数相等,相等的两个中,任意一个都是最大公约数。

a.常规

int gcd(int a, int b)
{
	do
    {
        if (a > b) a = a - b;
	    if (a < b) b = b - a;
	}while(a != b);
    return a;
}

b.递归

int gcd(int a, int b) 
{
    if (a == b) return a;//当a=b时,返回
    if (a < b) 
    {
        return gcd(a, b - a);
    }
    return gcd(a - b, b);
}



4.质因数分解法

int gcd(int a, int b) 
{
    int result = 1, i;
    for (i = 2; i <= a && i <= b; i++) 
    {
        while (a % i == 0 && b % i == 0)
        {
            result *= i;
            a /= i;
            b /= i;
            i = 1;
        }
    }
    return result;
}

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2301_80163571/article/details/136571212

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--