Python代码整数溢出问题:n>1200时出现无限值如何解决?
解决n>1200时Python代码输出无限值的问题
在学校项目中碰到一个问题:当输入的n大于1200时,下面的Python代码会输出无限整数值(inf)。
原问题代码
n = int(input()) s, counting = 4, 0 s_lst = [] if n == 0: print(0) elif n == 1: print(4) else: for i in range(1, n): if i % 2 == 1: s = s * 1.5 else: s = s * 2 print(int(s%(10**9+7)))
问题根源
问题出在浮点数乘法上:代码里用了*1.5这种浮点数操作,浮点数的精度和可表示范围都是有限的。当n超过1200时,经过数百次浮点数乘法累积,数值会超出浮点数的最大可表示范围,直接变成inf(无限大),后续的取模操作自然失效。
修复方案
核心就是彻底移除浮点数运算,改用纯整数计算。因为乘以1.5等价于乘以3再除以2,我们可以统计需要执行该操作的次数,把它转化为整数的乘除逻辑,完全规避浮点数的精度和溢出问题。
修复后代码
n = int(input()) s, counting = 4, 0 s_lst = [] mult = 1 if n == 0: print(0) elif n == 1: print(4) else: for i in range(1, n): if i % 2 == 1: s_lst.append(1.5) else: s = int(s * 2) if len(s_lst) % 2 == 0: for i in range(len(s_lst)//2): mult *= 3 else: for i in range(len(s_lst)//2+1): mult *= 3 mult = mult // 2 print((s * mult)%(10**9+7))
修复逻辑说明
- 先遍历统计所有需要执行
乘1.5操作的次数(存入s_lst),其余情况直接用整数执行乘2; - 根据统计的次数,将
乘1.5的操作转化为整数运算:- 若次数为偶数:通过整数乘3来合并多次
乘1.5的操作,避免浮点数介入; - 若次数为奇数:先按次数的一半乘3,最后多一次的话就再乘3后整除2,保证全程整数运算;
- 若次数为偶数:通过整数乘3来合并多次
- 最后将累积的整数结果取模
10^9+7,得到符合要求的输出。
内容的提问来源于stack exchange,提问作者kotm8
相关产品推荐
相关产品推荐

