我有以下代码:
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,以防万一
在这个过程中,您会遇到一个浮点错误。“但我用的是整数!”我听到你说,Python在这行上做浮点除法:
看似无害,但改为整数除法解决了问题:
在几百个值之后,其中一个除法给出的值比实际整数值小一些ε的错误,然后在调用
int(n)
时向下舍入编辑:在仔细检查我的最后一点以找到失败的值之后,我不是很正确。实际情况是,由于Pythons的BigInt实现,整数除法总是精确的,而浮点除法却不是,因为它仍然使用常规浮点数来提高速度。如果您的数字足够大,那么根本没有足够的字节来准确存储数字,这将导致舍入错误
所讨论的数字是
19981441939834942
。整数除法得到9990720969917471
,而浮点除法得到9990720969917472.0
这在您使用的任何语言中都是一个问题(除了大多数其他语言不允许您意外地对整数使用浮点除法),因此请确保使用整数除法
//
而不是/
测试代码:
测试结果:
固定代码:
结果:
相关问题 更多 >
编程相关推荐