stoic 发表于 2020-4-17 12:39:55

最大公约数

def gcd(lst):
    i = 1
    isgcd=False#isgcd判断是不是i是否被所有数整除,初始值为false
    while True:
      for j in range(len(lst)):
            print(type(lst))
            if lst % i == 0 and j == len(lst) - 1:
                isgcd=True   #i被所有数整除,isgcd为true
            elif lst % i == 0:
                continue#lst能整除i继续
            else:
                break   #lst不能整除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 % i == 0 and j == len(lst) - 1:
TypeError: not all arguments converted during string formatting

永恒的蓝色梦想 发表于 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())))

heidern0612 发表于 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))。因为你lst是字符串,所以print切片也是字符串。

再往下,因为你字符串没办法用求余除法,所以出错了。

liuzhengyuan 发表于 2020-4-17 14:08:10

用 %(取余) 时 把字符串弄成整数再运算

sunrise085 发表于 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))输出的。
之后程序就出错了。
出错原因是因为在主程序中你并没有将list1重点 各个元素变化层int类型,调用函数的时候,if lst % i == 0 and j == len(lst) - 1这一句对str类型的lst进行求余,就出错了


另外,你的程序逻辑问题特别大。根本实现不了求几个数的最大公约数
按照你的思路,在你能看明白的情况下帮你修改了一下
def gcd(lst):
    i = 1
    while i<=min(lst):          #循环的结束条件应该是这几个数的最小值
      for j in range(len(lst)):
            #print(type(lst))
            if lst % i != 0:#lst不能整除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=eval(list1)#这里应该将list1的值变为int类型
    print(type(list1))
k=gcd(list1)
print(k)

fan1993423 发表于 2020-4-17 14:57:58

from math import gcd
print(gcd(10,15))
最大公约数有库,不用那么麻烦自己写

txxcat 发表于 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 % i == 0 and j == len(lst) - 1:
                isgcd=True
            elif lst % 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)

虽然这题有更好的思路去做,但是你自己的思路也能走得通,理顺一下代码就可以了,不要只因为别人一句话你的思路不通就放弃了。
页: [1]
查看完整版本: 最大公约数