三种算法求解最大公约数和最小公倍数

1.穷举法

穷举法的基本思想是:根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。

穷举法时最通用的,也是最傻瓜式的一种算法,通过循环递增或者循环递减的方法来遍历所有合理范围内的数,通过判断是否满足条件来结束程序,从而得到最大公约数

解题步骤:

  1. 通过键盘输入两个需要求解的数
  2. 比较两数的大小,找出较小的数
  3. 采用循环递减的方法从最小数开始递减至1
  4. 判断当两数的取余都等于0时跳出循环
  5. 当前数即为最大的公约数

详细代码:

##穷举法求两数最大公约数
def getGreatdivisor(a,b):
    if a>b:#默认b较大得数,否则两数交换位置
        a,b=b,a
    for each in range(a+1,0,-1):
        if (a%each==0)&(b%each==0):
            result=each
            break;
    print("最大公约数为:",result)

a=int(input("first:"))
b=int(input("second:"))
getGreatdivisor(a,b)       

2.更相减损法

更相减损术是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。原文是:

1

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分。

解题步骤:

  1. 通过键盘输入两个需要求解的数a,b
  2. 比较两数的大小,找出较小的数,默认a为较小的数
  3. 较大数b减去较小数a,如果相减结果等于较小数a,算法终止,当前a或b即为最大的公约数
  4. 若减结果不等于较小数a,则转到第二步

详细代码:

##相减法求两数最大公约数
def getGreatdivisor(a,b):
    if a>b:#默认b较大得数,否则两数交换位置
        a,b=b,a
    if b-a==a:
        print("最大公约数为",a)
    else:
        getGreatdivisor(b-a,a)
        
a=int(input("first:"))
b=int(input("second:"))
getGreatdivisor(a,b)

 

3.辗转相除法

辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

解题步骤:

  1. 通过键盘输入两个需要求解的数a,b
  2. 比较两数的大小,找出较小的数,默认a为较小的数
  3. 较大数b取余较小数a,如果取余结果等于较小数a,算法终止,当前a或b即为最大的公约数
  4. 若取余结果不等于较小数a,则转到第二步

详细代码;

##辗转相除法求两数最大公约数
def getGreatdivisor(a,b):
    if a>b:#默认b较大得数,否则两数交换位置
        a,b=b,a
    if b%a==0:
        print("最大公约数为",a)
    else:
        getGreatdivisor(b%a,b)
    
a=int(input("first:"))
b=int(input("second:"))
getGreatdivisor(a,b)

 

4.用穷举法实现求任意个数的最大公约数和最小公倍数

基本思想:通过键盘输入需要求解的数值个数,将数值存放在一个列表中,对列表中的数值进行排序(会用到sort()函数),若要求最大公约数则从列表中去出第一个元素作为开始,若要求最小公倍数则从列表中去除最后一个元素作为开始。最后采用穷举法的思想求得解。

注:这其中的判断结束条件和之前有所不同,需要设置一个标记来记录是否列表中的所有元素都满足取余条件,没穷举一个数都需要遍历列表判断是否取余结果等于零,满足条件标记自增,否则跳出遍历循环继续试下一个数。当标记等于列表元素个数时结束程序,当前数即为最大公约数或者最小公倍数

详细代码:

##求n个数得最大公约数和最小公倍数
import sys
def getLCM(list,n):
    list.sort()
    max=list[n-1]
    for each in range(max,10000,):
        result=each
        count=0
        for number in range(len(list)):
            if each%list[number]==0:
                count+=1;
            else:
                break
        if count==len(list):
            break          
    print("最小公倍数为:",result)

    
def getGCD(list,n):
    list.sort()
    min=list[0]
    for each in range(min,0,-1):
        result=each
        count=0
        for number in range(len(list)):
            if list[number]%each==0:
                count+=1;
            else:
                break
        if count==len(list):
            break
    print("最大公约数为:",result)

list=[]
n=int(input("输入个数:"))
for i in range(n):
    list.append(int(input("输入第%d个数"%(i+1))))
getLCM(list,n) 
getGCD(list,n)

最大公约数_百度百科 https://baike.baidu.com/item/最大公约数/869308?fr=aladdin

你可能感兴趣的:(三种算法求解最大公约数和最小公倍数)