两个数的最大公约数怎么求?
思考题目的同时,我在这也顺便发出三个灵魂疑问?
不懂没关系,往下看
- 要解决两数的最大公约数问题?,你首先要知道什么是两数的公约数
- 解释:
- 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。
- 如果数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)
最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,年底还会抽奖送出我学过计算机相关专业的书籍福利。敬请期待!!!!