两数的最大公约数你会求吗?(内附完整java、python代码)

两个数的最大公约数怎么求?

思考题目的同时,我在这也顺便发出三个灵魂疑问?

不懂没关系,往下看

  1. 要解决两数的最大公约数问题?,你首先要知道什么是两数的公约数
  2. 解释:
  • 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。
  • 如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数
  • 例子: 12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16)=4。12、15、18的最大公约数是3,记为(12,15,18)=3。

那如何求呢?

其实这个问题的解法就在我开头提的三个疑问中。解决两数的最大公约数问题,可以有很多种方法,而上面提到的二种是最常见的(因为有一种是重复的)

画重点了:
欧几里得算法分析:

1.欧几里德算法又称辗转相除法,简称gcd
2, 该算法原理:以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数
3.该算法证明:请同志们移至度娘

gcd流程图:
在这里插入图片描述
如果gcd算法不好理解,那解决这道问题,可以直接用“枚举法”(也称为暴力算法

枚举算法分析:

  • 求a、b两个数的最大公因数。如果这两个数的最大公因数恰好是a、b其中一个,那肯定是a、b中较小者。例如: 2、4的最大公因数是2
  • 那我们可以先求出a、b最小者,然后让a、b两数分别和最小者求余,直到a、b两数同时求余结果为0时就结束循环,否则最小值自减一,然后继续循环

上代码

Java大哥

// 求两数的最大公约数
//	1.欧几里得算法
	public static int gcd(int q, int p)
	{
		if(p == 0)
		{
			return q;
		}
		int r = q % p;
		return gcd(p,r);
	}
//	2.枚举法:
	public static void YueShu(int a, int b)
	{
		int c = 0;
		if(a == 0 || b == 0)
		{
			System.out.println(a+"与"+b+"的最大公约数为:"+(a > b? a:b));
			return;
		}
		else if(a < b)
		{
			c = a;
		}
		else
		{
			c = b;
		}
		while((a%c)!=0 || (b%c)!=0)
		{
			c--;
		}
		System.out.println(a+"与"+b+"的最大公约数为:"+c);
	}

Python新竞大哥

"""欧几里得算法"""
#1.求两数的最大公约数
def gcd(p, q):
    if q == 0:
        return p
    r = p % q
    return gcd(q,r)
#2.枚举法
def meiju(a,b):
    if (a == 0) or (b == 0):
        t = a if a > b else b
        print("%d,%d两个数的最大公约数是:%d" %(a,b,t))
        return
    elif a > b:
        c = b
    else:
        c = a
    while(((a%c)!=0) or (b%c)!=0):
        c = c - 1
    print("%d,%d两个数的最大公约数是:%d" %(a,b,c))
        
if __name__ == "__main__":
    #输入两个数,以空格隔开
    a,b = map(int,input().split())
    #print("%d,%d两个数的最大公约数是:%d" %(a,b,gcd(a,b)))
    meiju(a,b)

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,年底还会抽奖送出我学过计算机相关专业的书籍福利。敬请期待!!!!
在这里插入图片描述

发布了39 篇原创文章 · 获赞 13 · 访问量 4847

猜你喜欢

转载自blog.csdn.net/qiukui111/article/details/104201815