鱼C论坛

 找回密码
 立即注册
查看: 2295|回复: 12

[已解决]第17课 函数:求最大公约数(习题)

[复制链接]
发表于 2021-1-7 18:10:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Peteryo01223 于 2021-1-7 18:13 编辑

原题目:
编写一个函数,利用欧几里得算法(脑补链接)求最大公约数,例如 gcd(x, y) 返回值为参数 x 和参数 y 的最大公约数。

小甲鱼的标准答案:
def gcd(x, y):
    while y:
        t = x % y
        x = y
        y = t

    return x
   
我的问题:如果不用欧几里得算法,我这个思路行么?为何报错了呀?

def gcd(x,y): #定义
        a = range[0:int(x)] # a 是一个 0 到 x 之间的整数
        b = range[0:int(y)] # b 是一个 0 到 x 之间的整数
        if a == b and x%a == 0 and y%b == 0: # a和b相等的时候,且 a 和 b 分别能被 x 和 y 整除
                return x # 返回 x,或者返回 y 也行吧
print (gcd(6,8))

报错内容:
Traceback (most recent call last):
  File "C:/Users/user/Desktop/20210107c.py", line 6, in <module>
    print (gcd(6,8))
  File "C:/Users/user/Desktop/20210107c.py", line 2, in gcd
    a = range[0:int(x)] # a 是一个 0 到 x 之间的整数
TypeError: 'type' object is not subscriptable


再次请教各位高手。
最佳答案
2021-1-7 19:47:02
本帖最后由 jackz007 于 2021-1-7 20:29 编辑
Peteryo01223 发表于 2021-1-7 18:19
def gcd(x,y): #定义
    a = range(int(x)) # a 是一个 0 到 x 之间的整数
    b = range(int(y)) # b ...


       你这个代码既没有循环,又没有对 x 的处理,最后却要返回 x,怎么能够做到?

       不过,我似乎明白了你的意思,就是通过枚举的方法,从 x,y 中较小的那一个起,从大往小逐一枚举,到 1 终止,如果 x、y 数能够同时整除枚举出来的某一个数,那么,这个除数自然就是最大公约数了。

       楼主试试这个代码
  1. #coding:gbk

  2. def gcd(x , y): #定义
  3.     if x > y :
  4.         x , y = y , x
  5.     for a in range(x , 1 , -1):
  6.         if x % a == 0 and y % a == 0:
  7.             break
  8.     return a

  9. print(gcd(6,8))
  10. print(gcd(96,80))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-7 18:14:12 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-7 18:16 编辑

        range() 是函数,不可以写成 range[]
        你为什么总是充满怀疑,不喜欢站在巨人的肩膀上,难道你吃的面粉不可以是农民伯伯种出来的,一定要亲自去种才能放心???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 18:19:00 | 显示全部楼层
jackz007 发表于 2021-1-7 18:14
range() 是函数,不可以写成 range[]
        你为什么总是充满怀疑,不喜欢站在巨人的肩膀上,难 ...

def gcd(x,y): #定义
    a = range(int(x)) # a 是一个 0 到 x 之间的整数
    b = range(int(y)) # b 是一个 0 到 x 之间的整数
    if a == b and x%a == 0 and y%b == 0: # a和b相等的时候,且 a 和 b 分别能被 x 和 y 整除
        return x # 返回 x,或者返回 y 也行吧
    print(gcd(x,y))

改为了(),不过还是报错~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-7 18:30:23 | 显示全部楼层
本帖最后由 昨非 于 2021-1-7 20:48 编辑
Peteryo01223 发表于 2021-1-7 18:19
def gcd(x,y): #定义
    a = range(int(x)) # a 是一个 0 到 x 之间的整数
    b = range(int(y)) # b ...

  1. def gcd(x,y): #定义
  2.     for a in range(int(x)): # a 是一个 0 到 x 之间的整数
  3.         for b in range(int(y)): # b 是一个 0 到 x 之间的整数
  4.             if a == b and x%a == 0 and y%b == 0: # a和b相等的时候,且 a 和 b 分别能被 x 和 y 整除
  5.                 return x # 返回 x,或者返回 y 也行吧  (有点奇怪,应该是返回相应的a,b值吧)
  6. print(gcd(x,y))  #具体运行要看你这个x y是啥
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-7 18:46:35 | 显示全部楼层
本帖最后由 三柒得拾 于 2021-1-7 18:54 编辑
Peteryo01223 发表于 2021-1-7 18:19
def gcd(x,y): #定义
    a = range(int(x)) # a 是一个 0 到 x 之间的整数
    b = range(int(y)) # b ...


楼主,这报错应该是这个SyntaxError:&#160;invalid&#160;character&#160;in&#160;identifier
出现这个报错一般是在注释#之间混入了中文输入法模式下的空格,检查下就好了。print后面的也是这样检查
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-7 19:47:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-7 20:29 编辑
Peteryo01223 发表于 2021-1-7 18:19
def gcd(x,y): #定义
    a = range(int(x)) # a 是一个 0 到 x 之间的整数
    b = range(int(y)) # b ...


       你这个代码既没有循环,又没有对 x 的处理,最后却要返回 x,怎么能够做到?

       不过,我似乎明白了你的意思,就是通过枚举的方法,从 x,y 中较小的那一个起,从大往小逐一枚举,到 1 终止,如果 x、y 数能够同时整除枚举出来的某一个数,那么,这个除数自然就是最大公约数了。

       楼主试试这个代码
  1. #coding:gbk

  2. def gcd(x , y): #定义
  3.     if x > y :
  4.         x , y = y , x
  5.     for a in range(x , 1 , -1):
  6.         if x % a == 0 and y % a == 0:
  7.             break
  8.     return a

  9. print(gcd(6,8))
  10. print(gcd(96,80))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-8 07:21:09 | 显示全部楼层
jackz007 发表于 2021-1-7 19:47
你这个代码既没有循环,又没有对 x 的处理,最后却要返回 x,怎么能够做到?

       不过, ...

哇 厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-8 07:23:19 | 显示全部楼层

你的我刚才试了试,也报错了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-8 07:24:42 | 显示全部楼层
三柒得拾 发表于 2021-1-7 18:46
楼主,这报错应该是这个SyntaxError:&#160;invalid&#160;character&#160;in&#160;identifier
出现这个 ...

哦。我目前还解读不了报错内容。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-8 08:50:40 | 显示全部楼层

       完全照你的思路版本,就是运行效率有点低。
  1. #coding:gbk

  2. def gcd(x,y): #定义
  3.     for a in range(x , 1 , - 1):                     # a 是一个 0 到 x 之间的整数
  4.         for b in range(y , 1 , - 1):                 # b 是一个 0 到 x 之间的整数
  5.             if a == b and x % a == 0 and y % b == 0: # a 和 b相等的时候,且 a 和 b 分别能被 x 和 y 整除
  6.                 return a
  7. print(gcd(80,96))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-8 10:04:45 | 显示全部楼层
jackz007 发表于 2021-1-8 08:50
完全照你的思路版本,就是运行效率有点低。

嗯嗯。看来我写的 range(int(x)), 或者 range(1 , x), 在Python中,都是不合法的。 必须写 range(x,1,-1) 才对。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-8 10:30:37 | 显示全部楼层
Peteryo01223 发表于 2021-1-8 10:04
嗯嗯。看来我写的 range(int(x)), 或者 range(1 , x), 在Python中,都是不合法的。 必须写 range(x,1,-1) ...

        因为是最大公约数,为了确保最大,因子必须从大往小枚举。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-1-8 10:34:12 | 显示全部楼层
jackz007 发表于 2021-1-8 10:30
因为是最大公约数,为了确保最大,因子必须从大往小枚举。

哦 原来如此 好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-26 22:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表