《零基础入门学习python》第17讲课后练习动动手1.
题目:1.编写一个函数,利用欧几里得算法求最大公约数,例如gcd(x,y)返回值为参数x和参数y的最大公约数。
自己总结归纳如下:
原理:a÷b=q......r1 ,若r1=0,那么b就是gcd(a,b) q是a除以b的商,r1是a除以b的余数,gcd(a,b)表示a和b的最大公约数。
若r1不等于0 , b÷r1=q......r2,若r2不等于0 ,r1除以r2......余数为0,那么r2就是gcd(a,b),以此类推。。。。。。
根据以上原理我自己写了代码(代码有问题)
>>> def gcd(x,y):
if x % y == 0: #如果x除以y没有余数
return y
else:
if y % (x % y) == 0: #x除以y有余数r1,y除以r1没有余数
return y % (x % y)
>>> print(gcd(6,3))
3
>>> print(gcd(4,2))
2
>>> print(gcd(6,9))
None
当x<y的时候出问题了,返回None,请问能在这个代码中加些什么解决这个问题吗?(已发到论坛上问)
在论坛上得到了回答,感谢鱼油们!!
鱼油们的解答:既然是只有x>y的时候才能正常输出,那就在函数开始加一个大小的判断
解法1.
def gcd(x,y):
x,y = (y,x) if x < y else (x,y) #三元操作符的运用
if x % y == 0:
return y
else:
if y % (x % y) == 0:
return y % (x % y)
解法2.
def gcd(x,y):
if y > x: #判断x和y的大小+换位置。如果x>y就跳过,如果x<y就往下
temp = x #temp==x的值
x = y #x==y的值
y = temp #y==temp==x的值,完成了x和y换位置。
if x % y == 0:
return y
else:
if y % (x % y) == 0:
return y % (x % y)
参考了其他的答案
百度答案:
def gcd(x,y):
if y != 0: #y不等于0
return gcd(y,x%y) #返回y除以(x%y)没有余数
else: #否则=y=0
return x #0和x的最大公约数就是x本身
x = int(input('请输入第一个数字:'))
y = int(input('请输入第二个数字:'))
print('%d 和 %d 的最大公约数为:'%(x,y),gcd(x,y))
>>> print(gcd(4,6))
2
小甲鱼答案:
def gcd (x,y):
while y: #实际上while循环的是 y = t = x%y
t = x % y #x % y赋值给t ,余数t
x = y #余数为0
y = t #余数t赋值给y
return x #y==0,0和x的最大公约数就是x本身
由此引出“递归问题”和“伪代码” 以后记录。