帮别人做了一个角谷猜想的Python程序,结果发现多组测试的时候的一些数据出现异常,能否帮助一下。
代码如下
```python
print('Copyright © 2022-2023 5556,All rights reserved.')
print('欢迎使用5556制作的角谷猜想v3.3!')
huida=input('请问使用单独模式还是历遍模式?\n在选择历遍模式之前,需要确认你的CPU是否在3.5GHz之上,内存为16GB以上.\n如果选择完毕,请输出 单独模式 或 历遍模式(如果输入其他字符,将默认为历遍模式)')
if huida=="单独模式":
n = int(input('请输入一个数字(自然数):'))
if n > 0:
m = n
zdm = 0
ys = n
zbs = 0
print('角谷猜想的整个序列是:')
while n!=1:
if n % 2 == 0:
k = n / 2
bs = zbs + 1
zbs = bs
del bs
print('%d'%n,end=" ")
print('/2=%d 所用步数:'%k,end=" ")
print('%d'%zbs,end="\n")
n = k
if n > m:
m = n
zdm = zbs
elif n == 1:
bs = zbs + 1
zbs = bs
del bs
print('%d 所用步数:'%n,end=" ")
print('%d'%zbs,end="\n")
break
else:
bs = zbs + 1
zbs = bs
del bs
g = 3 * n + 1
print('3*%d'%n,end=" ")
print('+1=%d 所用步数:'%g,end=" ")
print('%d'%zbs,end="\n")
n = g
if n > m:
m = n
zdm = zbs
pzl = m / ys
print('膨胀率为:%f'%pzl,end="\n")
print('初值为:%d'%ys,end="\n")
print('最大值为:%d'%m,end=',')
print('最大值出现的步数为:%d'%zdm,end='\n')
else:
m = n
zdm = 0
ys = n
zbs = 0
print('角谷猜想的整个序列是:')
while n!=1:
if n % 2 == 0:
k = n / 2
bs = zbs + 1
zbs = bs
del bs
print('%d'%n,end=" ")
print('/2=%d 所用步数:'%k,end=" ")
print('%d'%zbs,end="\n")
n = k
if n < m:
m = n
zdm = zbs
elif n == -1 or n == -5 or n== -17 :
bs = zbs + 1
zbs = bs
del bs
print('%d 所用步数:'%n,end=" ")
print('%d'%zbs,end="\n")
break
else:
bs = zbs + 1
zbs = bs
del bs
g = 3 * n + 1
print('3*%d'%n,end=" ")
print('+1=%d 所用步数:'%g,end=" ")
print('%d'%zbs,end="\n")
n = g
if n < m:
m = n
zdm = zbs
pzl = m / ys
print('膨胀率为:%f'%pzl,end="\n")
print('初值为:%d'%ys,end="\n")
print('最小值为:%d'%m,end=',')
print('最小值出现的步数为:%d'%zdm,end='\n')
else:
zdbs = 0
zdbssz = 0
zdz = 0
zdzsz = 0
zdpzl = float(0)
zdpzlsz = 0
zdpclsz = 0
n2 = int(input('请输入两个数字(自然数,并输入一个数字后,换行输入另一个,并按升序输入):'))
n1= int(input())
for n in range(n2,n1+1):
if n > 0:
m = n
zdm = 0
ys = n
zbs = 0
while n!=1:
if n % 2 == 0:
k = n / 2
bs = zbs + 1
zbs = bs
del bs
if zbs>zdbs :
zdbs = zbs
zdbssz = n
n = k
if n > m:
m = n
zdm = zbs
if m>zdz:
zdz=m
zdzsz = n
elif n == 1:
bs = zbs + 1
zbs = bs
del bs
if zbs>zdbs :
zdbs = zbs
zdbssz = n
if m>zdz:
zdz=m
zdzsz = n
break
else:
bs = zbs + 1
zbs = bs
del bs
g = 3 * n + 1
if zbs>zdbs :
zdbs = zbs
zdbssz = n
n = g
if n > m:
m = n
zdm = zbs
if m>zdz:
zdz=m
zdzsz = n
pzl = m / ys
if pzl>zdpzl:
zdpzl=float(pzl)
zdpzlsz = n
else:
m = n
zdm = 0
ys = n
zbs = 0
while n!=1:
if n % 2 == 0:
k = n / 2
bs = zbs + 1
zbs = bs
del bs
n = k
if zbs>zdbs :
zdbs = zbs
zdbssz = n
if n < m:
m = n
zdm = zbs
if mm
zdzsz = n
elif n == -1 or n == -5 or n== -17 :
bs = zbs + 1
zbs = bs
del bs
if zbs>zdbs :
zdbs = zbs
if mm
zdzsz = n
break
else:
bs = zbs + 1
zbs = bs
del bs
g = 3 * n + 1
n = g
if n < m:
m = n
zdm = zbs
if zbs>zdbs :
zdbs = zbs
zdbssz = n
if mm
zdzsz = n
pzl = m / ys
if pzl>zdpzl:
zdpzl=pzl
zdpzlsz = n
print('最大步数为:%d'%zdbs)
print('最大步数所在的数为:%d'%zdbssz)
print('所有最大值或最小值为:%d'%zdz)
print('最大值或最小值所在的数为:%d'%zdzsz)
print('最大膨胀率为:%f'%zdpzl)
print('最大膨胀率所在值为:%d'%zdpzlsz)
```
方案来自 梦想橡皮擦 狂飙组基于 GPT 编写的 “程秘”
这个程序中包含了输入自然数n的判断,同时使用了循环来处理多组数据,这是一个比较好的实践。但是在循环处理多组数据时,你应该注意到需要对之前循环的变量进行清空,否则可能会影响到后续的处理。
对于异常情况,程序中对于n等于-1、-5和-17的情况没有做处理,这些情况并不是所有负数都会出现的,也没有考虑对于n等于0的情况的处理。
此外,在单独模式下,n小于等于0的情况会出现最大值和最大值出现步数的错误,需要进行修正。以下是你的程序修正后的代码:
print('Copyright © 2022-2023 5556,All rights reserved.')
print('欢迎使用5556制作的角谷猜想v3.3!')
huida = input('请问使用单独模式还是历遍模式?\n在选择历遍模式之前,需要确认你的CPU是否在3.5GHz之上,内存为16GB以上.\n如果选择完毕,请输出 单独模式 或 历遍模式(如果输入其他字符,将默认为历遍模式)')
if huida == "单独模式":
n = int(input('请输入一个数字(自然数):'))
if n > 0:
m = n
zdm = 0
ys = n
zbs = 0
print('角谷猜想的整个序列是:')
while n != 1:
if n % 2 == 0:
k = n / 2
bs = zbs + 1
zbs = bs
del bs
print('%d' % n, end=" ")
print('/2=%d 所用步数:' % k, end=" ")
print('%d' % zbs, end="\n")
n = k
if n > m:
m = n
zdm = zbs
elif n == 1:
bs = zbs + 1
zbs = bs
del bs
print('%d 所用步数:' % n, end=" ")
print('%d' % zbs, end="\n")
break
else:
bs = zbs + 1
zbs = bs
del bs
g = 3 * n + 1
print('3*%d' % n, end=" ")
print('+1=%d 所用步数:' % g, end=" ")
print('%d' % zbs, end="\n")
n = g
if n > m:
m = n
zdm = zbs
pzl = m / ys
print('膨胀率为:%f' % pzl, end="\n")
print('初值为:%d' % ys, end="\n")
print('最大值为:%d' % m, end=',')
print('最大值出现的步数为:%d