鱼C论坛

 找回密码
 立即注册
查看: 868|回复: 6

[已解决]最大公约数

[复制链接]
发表于 2020-4-17 12:39:55 | 显示全部楼层 |阅读模式

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

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

x
def gcd(lst):
    i = 1
    isgcd=False  #isgcd判断是不是i是否被所有数整除,初始值为false
    while True:
        for j in range(len(lst)):
            print(type(lst[j]))
            if lst[j] % i == 0 and j == len(lst) - 1:
                isgcd=True   #i被所有数整除,isgcdtrue
            elif lst[j] % i == 0:
                continue  #lst[j]能整除i继续
            else:
                break   #lst[j]不能整除i跳出循环
        if isgcd==True:
            i+=1
        else:
            break
    return i


num=input("shuru:")
list1=num.split(" ")
print(len(list1))
for i in list1:
    i=eval(i)
    print(type(i))
k=gcd(list1)
print(k)
以上代码运行后,是这个结果,有两个问题请教:一是代码错误在哪,二是为什么会打印一行<class 'str'>出来?
shuru:2 4 6
3
<class 'int'>
<class 'int'>
<class 'int'>
<class 'str'>
Traceback (most recent call last):
  File "D:/PyCharm Community Edition 2019.3.4/PycharmProjects/untitled/list/习题12(未).py", line 26, in <module>
    i=gcd(list1)
  File "D:/PyCharm Community Edition 2019.3.4/PycharmProjects/untitled/list/习题12(未).py", line 7, in gcd
    if lst[j] % i == 0 and j == len(lst) - 1:
TypeError: not all arguments converted during string formatting
最佳答案
2020-4-17 14:33:46
本帖最后由 sunrise085 于 2020-4-17 14:49 编辑

先说一下前面几个输出都是怎么来的。看注释。
num=input("shuru:")
list1=num.split(" ")
print(len(list1))   #那个3,是这里输出的
for i in list1:
    i=eval(i)
    print(type(i))  #那三个<class 'int'>是这里输出的
最后的那个<class 'str'>是调用函数时,第一次for循环那个print(type(lst[j]))输出的。
之后程序就出错了。
出错原因是因为在主程序中你并没有将list1重点 各个元素变化层int类型,调用函数的时候,if lst[j] % i == 0 and j == len(lst) - 1  这一句对str类型的lst[j]进行求余,就出错了


另外,你的程序逻辑问题特别大。根本实现不了求几个数的最大公约数
按照你的思路,在你能看明白的情况下帮你修改了一下
def gcd(lst):
    i = 1
    while i<=min(lst):          #循环的结束条件应该是这几个数的最小值
        for j in range(len(lst)):
            #print(type(lst[j]))
            if lst[j] % i != 0:#lst[j]不能整除i,跳出本层循环,继续下一个数的判断
                i+=1
                break
        else:            #都能整除,标记这个数,进行下一个数的判断
            result=i
            i+=1
    return result

num=input("shuru:")
list1=num.split(" ")
print(len(list1))
for i in range(len(list1)):
    list1[i]=eval(list1[i])  #这里应该将list1的值变为int类型
    print(type(list1[i]))
k=gcd(list1)
print(k)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-17 13:03:59 | 显示全部楼层
实在看不懂你写的,不如你试试下面这个代码?
def gcd(a,*values):
    for b in values:
        while b:
            temp=a%b
            a=b
            b=temp
    return a

print(gcd(*map(int,input("shuru:").split())))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 13:23:47 | 显示全部楼层
本帖最后由 heidern0612 于 2020-4-17 13:36 编辑

写的太乱,没看太明白。

你函数实例化传入的是个字符串,而不是个数字。


一步步看:

第一个print打印的结果是1,因为你传入的是个字符串形式的数字,只有一个长度,也就是print(len(list1))的结果。

第二个打印的是print(type(i)),因为你输入的只有一个数字,i只打印了一次,for循环的时候i默认就是循环的长度,所以长度是个int类型。

第三个打印的是K实例化,进入def里面,打印的是print(type(lst[j]))。因为你lst是字符串,所以print切片也是字符串。

再往下,因为你字符串没办法用求余除法,所以出错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 14:08:10 From FishC Mobile | 显示全部楼层
用 %(取余) 时 把字符串弄成整数再运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 14:33:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-4-17 14:49 编辑

先说一下前面几个输出都是怎么来的。看注释。
num=input("shuru:")
list1=num.split(" ")
print(len(list1))   #那个3,是这里输出的
for i in list1:
    i=eval(i)
    print(type(i))  #那三个<class 'int'>是这里输出的
最后的那个<class 'str'>是调用函数时,第一次for循环那个print(type(lst[j]))输出的。
之后程序就出错了。
出错原因是因为在主程序中你并没有将list1重点 各个元素变化层int类型,调用函数的时候,if lst[j] % i == 0 and j == len(lst) - 1  这一句对str类型的lst[j]进行求余,就出错了


另外,你的程序逻辑问题特别大。根本实现不了求几个数的最大公约数
按照你的思路,在你能看明白的情况下帮你修改了一下
def gcd(lst):
    i = 1
    while i<=min(lst):          #循环的结束条件应该是这几个数的最小值
        for j in range(len(lst)):
            #print(type(lst[j]))
            if lst[j] % i != 0:#lst[j]不能整除i,跳出本层循环,继续下一个数的判断
                i+=1
                break
        else:            #都能整除,标记这个数,进行下一个数的判断
            result=i
            i+=1
    return result

num=input("shuru:")
list1=num.split(" ")
print(len(list1))
for i in range(len(list1)):
    list1[i]=eval(list1[i])  #这里应该将list1的值变为int类型
    print(type(list1[i]))
k=gcd(list1)
print(k)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 14:57:58 | 显示全部楼层
from math import gcd
print(gcd(10,15))
最大公约数有库,不用那么麻烦自己写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 14:59:13 | 显示全部楼层
本帖最后由 txxcat 于 2020-4-17 22:33 编辑

你想把输入的数字转换为数组,但是你对列表的处理有误,传出去的还是没有更改的字符组成的数组,第四个str其实就是函数的那个print打印出来的,因为它接受的参数就是字符,自然后面的也就不能运行了。
改成这样就可以了:
num=input("shuru:")
list1=num.split(" ")
newlist=[]
for i in list1:
    newlist.append(eval(i))
但是,运行起来死循环了,说明函数里面还是有问题。按照你的思路改写了代码,写了注释,去掉了你调试的代码:
def gcd(lst):
    i = 1
    while True:
        isgcd=False  #不在每次循环初始化,就会死循环
        for j in range(len(lst)):
            if lst[j] % i == 0 and j == len(lst) - 1:
                isgcd=True
            elif lst[j] % i == 0:
                continue
            else:
                break 
        if isgcd==True:  #能被所有数字都整除了,记录下来,有更大的符合条件的数就覆盖
            num=i
        i+=1             #必须每次循环都加1才能保证健康正常运行
        if i> max(lst)//2 or i >min(lst):    #退出条件,除数到了最大数的一半或者超过最小数就不用再继续计算了
            break
    return num


num=input("shuru:")
list1=num.split(" ")
newlist=[]
for i in list1:
    newlist.append(eval(i))
k=gcd(newlist)
print(k) 
虽然这题有更好的思路去做,但是你自己的思路也能走得通,理顺一下代码就可以了,不要只因为别人一句话你的思路不通就放弃了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-6 15:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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