对素数检查功能感到困惑

时间:2017-03-01 15:13:55

标签: math

我遇到了关于如何检查数字是否为素数的堆栈溢出问题。答案是下面的代码。当数字为素数0时,函数int is_prime(int num)返回1,否则返回。

int is_prime(int num)
{
    if (num <= 1) return 0;
    if (num % 2 == 0 && num > 2) return 0;
    for(int i = 3; i < num / 2; i+= 2)
    {
        if (num % i == 0)
            return 0;
    }
    return 1;
}

除了for循环表达式之外,if语句中的所有逻辑对我都有意义。我不明白为什么分区i < num / 2发生以及为什么i+= 2被使用。当然有一个是推进计数器,另一个是停止循环。但为什么一半的数字和为什么增加两个。任何合理的解释将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

关于循环的增量:
第二个ifif (num % 2 == 0))检查数字是否为偶数,如果是,则终止该函数。如果函数没有被终止,我们知道它是奇数,因此,只能被其他奇数整除。因此,循环从3开始,并根据一系列奇数检查数字 - 即,在每次迭代时将潜在除数递增2。

关于循环的停止条件:
大于1的最小整数是2.因此,可以除以整数n的最大整数是n / 2。因此,循环可以达到num/2。如果它num到达num/2时没有找到除数,它就没有机会找到这样的除数,所以继续前进是没有意义的。