求3到100素数的C语言代码中p/primes[i]>=primes[i]的逻辑是什么
代码条件设计逻辑解答
核心等价性
你对校验逻辑的原始理解是完全正确的:p / primes[i] >= primes[i]就是「仅用不大于p平方根的素数做整除校验」的等价整数实现,和primes[i] <= sqrt(p)的校验边界完全一致。
我们可以做个简单的数学推导:
因为primes[i]是正整数,不等式两边同时乘primes[i]不会改变不等号方向,原条件可以变换为:p >= primes[i] * primes[i]
也就是primes[i] <= √p,和你原本预想的逻辑完全匹配。
为什么用除法实现而不是乘法或者开平方?
这个写法是C语言整数运算的常用优化,规避了两类问题:
- 避免浮点数运算开销与精度误差:如果调用
sqrt()函数需要做浮点数转换和运算,大整数场景下还可能出现浮点数精度不够导致的边界判断错误 - 避免乘法溢出风险:如果p的取值范围非常大,
primes[i] * primes[i]的结果可能超过int类型的最大值,触发整数溢出得到错误值,除法运算不存在这类溢出问题
你举的p=5的案例符合设计预期
当p=5时,内层循环第一个校验的素数是primes[1] = 3:
C语言的整数除法会截断小数部分,5 / 3的计算结果是1,1 >= 3显然不成立,所以内层循环直接终止,判定5为素数。
这个逻辑是完全正确的:因为3的平方是9>5,所以不需要校验3能不能整除5,小于9的奇数只要不能被3整除就一定是素数。
额外的代码优化细节
你可以注意到内层循环的i是从1开始的,这是因为外层遍历的p从5开始每次加2,所有待校验的p都是奇数,天然不可能被2整除,所以直接跳过primes[0]=2的校验,进一步减少了运算量。
内容的提问来源于stack exchange,提问作者rosterrz
相关产品推荐
相关产品推荐

