1.穷举法
穷举法的基本思想是:根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。
穷举法时最通用的,也是最傻瓜式的一种算法,通过循环递增或者循环递减的方法来遍历所有合理范围内的数,通过判断是否满足条件来结束程序,从而得到最大公约数
解题步骤:
- 通过键盘输入两个需要求解的数
- 比较两数的大小,找出较小的数
- 采用循环递减的方法从最小数开始递减至1
- 判断当两数的取余都等于0时跳出循环
- 当前数即为最大的公约数
详细代码:
##穷举法求两数最大公约数
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来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分。
解题步骤:
- 通过键盘输入两个需要求解的数a,b
- 比较两数的大小,找出较小的数,默认a为较小的数
- 较大数b减去较小数a,如果相减结果等于较小数a,算法终止,当前a或b即为最大的公约数
- 若减结果不等于较小数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为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
解题步骤:
- 通过键盘输入两个需要求解的数a,b
- 比较两数的大小,找出较小的数,默认a为较小的数
- 较大数b取余较小数a,如果取余结果等于较小数a,算法终止,当前a或b即为最大的公约数
- 若取余结果不等于较小数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