You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:06:03