最大公约数
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
实在看不懂你写的,不如你试试下面这个代码?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:36 编辑
写的太乱,没看太明白。
你函数实例化传入的是个字符串,而不是个数字。
一步步看:
第一个print打印的结果是1,因为你传入的是个字符串形式的数字,只有一个长度,也就是print(len(list1))的结果。
第二个打印的是print(type(i)),因为你输入的只有一个数字,i只打印了一次,for循环的时候i默认就是循环的长度,所以长度是个int类型。
第三个打印的是K实例化,进入def里面,打印的是print(type(lst))。因为你lst是字符串,所以print切片也是字符串。
再往下,因为你字符串没办法用求余除法,所以出错了。 用 %(取余) 时 把字符串弄成整数再运算 本帖最后由 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) from math import gcd
print(gcd(10,15))
最大公约数有库,不用那么麻烦自己写 本帖最后由 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]