Python是否在处理大量数字/列表时遇到问题,或者我的代码是否有问题?

2024-09-27 00:16:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

def main(n):
    sequence = []
    while n not in sequence:
        sequence.append(n)

        if n % 2 == 0:
            i = n / 2
        else:
            i = (n * 3) + 1
        n = int(i)

    print("Sequence length: " + str(len(sequence)-1))

n = int(input("Number: "))
main(n)

它从用户那里获取一个整数,然后计算该数字的“3x+1”(或“Collatz”)序列(有关详细信息,请参见http://www.ericr.nl/wondrous/index.html#part1)。然后显示序列的长度

为了确保代码按预期工作,我将结果与http://www.ericr.nl/wondrous/delrecs.html上的表进行比较,'Delay'列似乎是序列长度,“N”是输入的初始整数。我的代码给出了所有“N”值(我随机测试过)的正确长度,最长为1899148184679(#92)。但是,对于下一个值'N'(2081751768559,#93),它给出了长度'385'(而不是'1437')。。。对于“N”(我已经测试过)上大于表中值的所有值也是如此——我的代码给出的答案比它们给出的答案小得多

Python是否存在可能导致这种行为的大量问题,或者我的代码是否有问题

我承认我不完全理解“延迟记录”,或者确实不理解该网页上的大部分信息。但是,即使我错误地假设“延迟记录”只是由该方法生成的序列的长度,我的代码将计算相同的值直到该特定数字,这似乎很奇怪

我正在使用Python3.8.10,以防万一


Tags: 答案代码httpmainhtmlwwwnl记录
2条回答

在这个过程中,您会遇到一个浮点错误。“但我用的是整数!”我听到你说,Python在这行上做浮点除法:

i = n / 2

看似无害,但改为整数除法解决了问题:

i = n // 2

在几百个值之后,其中一个除法给出的值比实际整数值小一些ε的错误,然后在调用int(n)时向下舍入

编辑:在仔细检查我的最后一点以找到失败的值之后,我不是很正确。实际情况是,由于Pythons的BigInt实现,整数除法总是精确的,而浮点除法却不是,因为它仍然使用常规浮点数来提高速度。如果您的数字足够大,那么根本没有足够的字节来准确存储数字,这将导致舍入错误

所讨论的数字是19981441939834942。整数除法得到9990720969917471,而浮点除法得到9990720969917472.0

这在您使用的任何语言中都是一个问题(除了大多数其他语言不允许您意外地对整数使用浮点除法),因此请确保使用整数除法

  • 您需要使用//而不是/
  • 错误发生在编号19981441939834942中,它是序列中的85个索引

测试代码:

x = 19981441939834942
print(19981441939834942 // 2)
print(int(19981441939834942 / 2)) # your code to calculate it.

测试结果:

9990720969917471 #correct result
9990720969917472 #wrong result

固定代码:

def main(n):
    sequence = []
    while n not in sequence:
        sequence.append(n)

        if n % 2 == 0:
            n = n // 2 # you use `/` then convert to int, which may cause wrong result when n is a huge number.
        else:
            n = (n * 3) + 1
        # n = int(i)
    print("Sequence length: " + str(len(sequence)-1))

n = 2081751768559
main(n)

结果:

Sequence length: 1437

相关问题 更多 >

    热门问题