请解释生成100以内素数的C程序中指定循环语句的逻辑
这段素数判断循环的逻辑解释
这段代码是用试除法判断数p是否为素数的核心逻辑,先明确几个前置条件:
primes数组已经存储了之前找到的素数(比如先存入了2、3、5这类已确认的素数)isPrime初始值为true,默认当前数p是素数- 程序只需要验证
p是否为素数,从而决定是否把它加入primes数组
下面拆解循环的每一部分:
- 循环初始化
i = 1:从primes数组的第二个元素开始试除(一般第一个元素是2,程序可能已经单独处理了偶数的情况,只对奇数p做后续判断) - 循环持续的两个判断条件:
isPrime:只要isPrime变成false(已经确定p是合数),立刻终止循环,避免不必要的计算p / primes[i] >= primes[i]:等价于primes[i] * primes[i] <= p。这是试除法的优化逻辑——如果p有一个大于√p的因数,那对应的另一个因数必然小于√p,而小于√p的因数早已经被前面的素数检查过了,所以到这里就可以停止循环,不用再试更大的素数
- 循环体里的判断:
if (p % primes[i] == 0)
每次用当前素数primes[i]整除p,如果余数为0,说明p能被这个素数整除,也就是p是合数,直接把isPrime设为false,标记p不是素数
举个实际例子:比如判断p=29是否为素数,此时primes数组里有2、3、5
i=1,primes[i]=3,3*3=9 ≤29,检查29%3≠0,继续循环i=2,primes[i]=5,5*5=25 ≤29,检查29%5≠0,继续循环i=3,primes[i]=7,7*7=49>29,循环终止,isPrime仍为true,所以29是素数
内容的提问来源于stack exchange,提问作者Tanay Mithari
相关产品推荐
相关产品推荐

