512位大数分解代码问题:无法将n-1表示为m*2^k
解决大数n下将n-1表示为m*2^k时断言失败的问题
嘿,这问题我太熟了——你踩了浮点数精度丢失的坑!
当你处理515位这种级别的超大整数时,用total /= 2会把整数转换成浮点数来运算,但Python里的float是双精度类型,最多只能保留53位有效数字。这么大的数转成浮点数后,后面的数位直接就被截断丢失了,最后算出来的m和k自然和真实值不符,断言肯定通不过。
解决方法超简单,把浮点数除法换成整数除法就行,全程保持整数运算,完全不会丢精度:
# 将(n-1)表示为m*2^k(m为奇数) k = 0 # 能被2整除的次数 total = n - 1 while total % 2 == 0: total = total // 2 # 用整数除法替代浮点数除法,避免精度丢失 k += 1 m = total # total始终是整数,无需额外转int assert (n-1) == (2**k) * m, "分解结果不匹配!"
Python的整数支持无限精度,不管你的n是几百位还是几千位,用整数除法处理都稳得一批,断言肯定能通过~
内容的提问来源于stack exchange,提问作者Daniel E
相关产品推荐
相关产品推荐

