鱼C论坛

 找回密码
 立即注册

1.关于最大公约数的问题及相关

已有 617 次阅读2016-8-4 16:56 |个人分类:python

《零基础入门学习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本身

由此引出“递归问题”和“伪代码”   以后记录。



路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 21:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部