Python中range()参数能否为浮点数?完全数求解相关疑问
关于Python range()处理非整数上限的问题
首先明确一个关键:Python的range()函数只能接受整数作为起始、结束、步长参数,如果直接传入浮点数(比如28的平方根≈5.291),会直接抛出TypeError,所以你觉得“可行”,应该是代码里已经对平方根做了取整操作(比如用int()转换),只是没留意到。
当你把浮点数平方根用int()转换后,Python会直接截断小数部分(向下取整),而不是四舍五入。比如int(math.sqrt(28))会得到5,而非6。
结合你找完全数的场景,这个逻辑是合理的:
- 对于一个数n,若i是它的约数,那么n/i也必然是它的约数
- 当i超过n的平方根时,n/i就会小于平方根,这时候对应的约数对已经被遍历过了
- 所以只需要遍历1到
int(sqrt(n))之间的整数,就能找到所有不重复的约数对
举个具体的代码例子:
import math def check_perfect_number(n): if n <= 1: return False total = 1 # 1是所有正整数的约数 sqrt_val = math.sqrt(n) # 遍历2到整数平方根+1,确保覆盖到平方根本身(比如4的平方根是2) for i in range(2, int(sqrt_val) + 1): if n % i == 0: total += i pair = n // i if pair != i: # 避免平方数的约数重复累加 total += pair return total == n print(check_perfect_number(28)) # 输出True
如果你想更精准地获取整数平方根(避免浮点数精度问题),可以用Python 3.8+新增的math.isqrt()函数,它直接返回n的整数平方根(向下取整),比如math.isqrt(28)直接得到5,比int(math.sqrt(n))更可靠。
内容的提问来源于stack exchange,提问作者Isah Rop
相关产品推荐
相关产品推荐

