Python中超出了时间限制,代码用于检查数字是否可以减少为“1”

Python中超出了时间限制,代码用于检查数字是否可以减少为“1”,python,algorithm,Python,Algorithm,我正在研究这个问题: 您将获得一个数字N。您可以在N上执行任意次数的以下操作: -如果N是偶数,则将N除以2 -如果N为奇数,则将N替换为3N+1 您的任务是找出,对于给定的N,在N上执行上述两个有效操作任意次数后,是否有可能达到数字1 我试着用我写的代码来实现它: import math t=int(input()) for _ in range(t): n=int(input()) check=[] while True: if(math.log(n,

我正在研究这个问题:

您将获得一个数字N。您可以在N上执行任意次数的以下操作:

-如果N是偶数,则将N除以2

-如果N为奇数,则将N替换为3N+1

您的任务是找出,对于给定的N,在N上执行上述两个有效操作任意次数后,是否有可能达到数字1

我试着用我写的代码来实现它:

import math
t=int(input())
for _ in range(t):
    n=int(input())
    check=[]
    while True:
        if(math.log(n,2)%1==0):
            print("YES")
            break
        elif(n in check):
            print("NO")
            break
        else:
            check.append(n)
            if(n==1):
                print("YES")
                break
            elif(n%2==0):
                n=n//2
            else:
                n=(3*n)+1
在这里,我首先检查数字是否是2的幂,因为任何2的幂都可以减少到1。如果不是,我将其附加到一个空列表中,以检查该数字是否重复,如果该数字本身重复,我将打破while循环以打印NO。在else条件下,我已根据问题实现了逻辑。t是测试用例的数量

我有一个超过时间限制的测试用例,我不知道如何处理它。这是超过时间限制的数字:

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111113333333333333333333333333333333333333333333333333333333399999992222222111111111111111111111111111111111232323232323232323232323232323232323232323255555667777777777777788888888888888888818181818181812222222333333333333333333333333333333333333333333333333333333333333333333333333333333333355555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557777777777777777777777777777777777777777777777777777777777777777777777777777777777777778888888888888888888899999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999911111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111199999999901111111101111110111111111111122222222200000001111111111111922222222222222222229333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333377777777777777777777777777777777777777777777444444444444400000000999999999999999999999000011111111111111111111111111111111111111111111111111111111111111111111111111111922222222222229999999999666666666666667777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777771111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111119999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999333333333333333333333333333333333333333333337272728293871273187391831731237198239183139173981273917931318273193138139812398139172338218328131831928218781793173818718728179128382781191279719381291821721212102171989181019028127218727810817908729187192187910879128701872987127128871298172287193103981813812381318738138181111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111999999999999999999999999999999999999999999999990000029999999999999999999999999922222222555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555

当我在本地IDE上运行此代码时,需要时间,但返回正确的输出,但是我应该如何在编码平台中处理此类测试用例。任何帮助都将不胜感激。

首先,请进行适当的研究,以了解如何更快地做到这一点。Python Collatz将为您提供大量的源代码

至于您的特定实现,您有一些不幸的开销。首先,由于浮点精度问题,对于30以上的大多数指数,2次幂检查失败。简单地摆脱它;你花在寻找2的力量上的时间大部分是浪费的


用更好的成员资格检查更新代码;试着使用一个集合对那个大整数进行计时实验,并用已知收敛到黑洞周期4-2-1的整数列表对集合进行种子设定。你可以从所有整数开始,比如说10^6。事实上,在开始阅读输入之前单独检查10000个数字可能会更快。

列表检查的目的是什么?在一个大的列表中测试成员身份是很慢的。如果一个数字在列表中重复,这意味着数字N永远不会减少到1,并且会不断循环,因此如果一个数字重复,我就打破循环并打印NO@CutePanda在这种情况下,一个数字永远不会减少到1,是否曾经达到过?这与一个名为“jidicula”的未解决问题有关。@jidicula是的,没有一个测试用例中的数字不减少到1,但问题仍然说明我们需要使用算法检查数字是否减少到1使用集合而不是列表检查值,解决了问题。谢谢你的帮助!