繁体   English   中英

Python中超过时间限制,检查数字是否可以减少到“1”的代码

[英]Time limit exceeded in Python, code to check if a number can be reduced to “1”

我正在研究这个问题:

给您一个数字 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。如果不是,我将 append 放到一个空列表中,以检查该数字是否重复以及是否数字重复自己我跳出while循环以打印“否”。 在其他情况下,我已经根据问题实现了逻辑。 t 是测试用例的数量。

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

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111113333333333333333333333333333333333333333333333333333333399999992222222111111111111111111111111111111111232323232323232323232323232323232323232323255555667777777777777788888888888888888818181818181812222222333333333333333333333333333333333333333333333333333333333333333333333333333333333355555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557777777777777777777777777777777777777777777777777777777777777777777777777777777777777778888888888888888888899999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999911111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111199999999901111111101111110111111111111122222222200000001111111111111922222222222222222229333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333377777777777777777777777777777777777777777777444444444444400000000999999999999999999999000011111111111111111111111111111111111111111111111111111111111111111111111111111922222222222229999999999666666666666667777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777771111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111119999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999333333333333333333333333333333333333333333337272728293871273187391831731237198239183139173981273917931318273193138139812398139172338218328131831928218781793173818718728179128382781191279719381291821721212102171989181019028127218727810817908729187192187910879128701872987127128871298172287193103981813812381318738138181111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111999999999999999999999999999999999999999999999990000029999999999999999999999999922222222555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555

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

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

至于您的特定实现,您有一些不幸的开销。 首先,由于浮点精度问题,对于大多数高于 30 的指数,您的 2 次幂检查失败。只需摆脱它; 您花在寻找 2 的幂上的时间大部分都被浪费了。

使用更好的会员检查更新您的代码; 尝试使用一个集合(对那个大整数进行计时实验),并用一个已知会收敛到 4-2-1 的“黑洞”循环的整数列表为该集合播种。 您可以从所有整数开始,例如 10^6。 事实上,在开始阅读输入之前单独检查 10,000 个数字可能会更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM