hello,c++ 2023-02-20 21:01 采纳率: 60%
浏览 14

Python版角谷猜想遇到问题

帮别人做了一个角谷猜想的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 m<zdz:
                        zdz=m
                        zdzsz = n
                elif n == -1 or n == -5 or n== -17 :
                    bs = zbs + 1
                    zbs = bs
                    del bs
                    if zbs>zdbs :
                        zdbs = zbs
                    if m<zdz:
                        zdz=m
                        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 m<zdz:
                        zdz=m
                        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)
    





```

  • 写回答

1条回答 默认 最新

  • 梦想橡皮擦 Python领域优质创作者 2023-02-20 23:16
    关注

    方案来自 梦想橡皮擦 狂飙组基于 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
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 2月20日

悬赏问题

  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照