3x+1问题Python实现中极长整数判断被2整除结果异常
问题原因
你遇到的问题和长整数处理无关,是错误使用浮点数除法导致的精度丢失问题:
- Python 中
/运算符默认返回浮点数类型,你代码中使用num /= 2后,原本的大整数会被强制转换为双精度浮点数 - 双精度浮点数仅能精确存储不超过2^53(约9e15)的整数,你给出的初始num是40位十进制超大整数,远高于这个精度阈值,转换为浮点数时低位会被自动截断舍入,因此后续的奇偶判断(
num % 2 ==0)、数值运算结果全部错误 - 你观察到的第一次除以2后结果末尾为0就是精度丢失的直接证据,该数值的正确计算结果末尾为3,本身就是奇数,第二次迭代本就应该执行3x+1逻辑。连续20次返回偶数的现象,本质是浮点数舍入后的值末尾刚好连续多了20个二进制0,直到迭代20次后数值缩小到浮点数可精确表示的范围,结果才恢复正常。
修复方案
将浮点数除法改为整数除法即可,全程使用Python原生任意精度int类型运算,不会出现精度丢失:
把代码中的
num /= 2
替换为
num //= 2
修复后完整参考代码
num = 3656565605161651626526625291991265161656 while num != 1: if num % 2 == 0: num //= 2 print("2") else: num = num * 3 + 1 print("3") print(num)
内容的提问来源于stack exchange,提问作者Bros
相关产品推荐
相关产品推荐

