从一本书中了解C的例子?

时间:2014-08-29 08:11:32

标签: c

我正在向Stephen Kochan学习Programming in C。程序7.4修改程序以生成素数,第2版:

#include <stdio.h>
#include <stdbool.h>

// Modified program to generate prime numbers
int main (void)
{
    int p, i, primes[50], primeIndex = 2;
    bool isPrime;
    primes[0] = 2;
    primes[1] = 3;

    for ( p = 5; p <= 50; p = p + 2 ) {
        isPrime = true;

        for ( i = 1; isPrime && p / primes[i] >= primes[i]; ++i )
            if ( p % primes[i] == 0 )
            isPrime = false;
            if ( isPrime == true ) {
                primes[primeIndex] = p;
                ++primeIndex;
            }
        }
        for ( i = 0; i < primeIndex; ++i )
            printf ("%i ", primes[i]);

    printf ("\n");
    return 0;
}

问题是我无法理解它是如何工作的。

  

表达式

    p / primes[i] >= primes[i]
     

在最里面的for循环中用作测试以确保该值   p不超过素数的平方根[i]。这个测试来了   直接来自前一段的讨论。 (你可能会   我想稍微考虑一下数学。)

那本书给我看了另一行:

  

如果是,则isPrime设置为false。 for循环继续   执行只要isPrime的值为true且值为   primes[i]不超过p的平方根。

请解释该行

2 个答案:

答案 0 :(得分:1)

素数仅除以1和本身 因此,可以被整除的最大数是它的平方根。

如果p是正整数,则下面是相同的等式。

1) primes[i] <= square root of (p)  
2) primes[i] * primes[i] <= p
3) p >= primes[i] * primes[i]
4) p / primes[i] >= primes[i]

答案 1 :(得分:0)

假设数字p = 99,那么如果循环中没有isPrime检查,则循环将检查sqrt(99)= 9,即9个素数。那就是:

for ( i = 1;  p / primes[i] >= primes[i]; ++i )
        if ( p % primes[i] == 0 )
          isPrime = false;
然后它会进行9次检查,即使99可以被3整除。但是99可以被3整除。那么我们还需要进一步测试它吗?不,所以我们可以在这里停下来,这就是为什么我们设置一个标志变量来测试它是否已被9个素数范围内的任何素数整除。

因此,如果我们在循环中添加isPrime:

for ( i = 1; isPrime && p / primes[i] >= primes[i]; ++i )
            if ( p % primes[i] == 0 )
            isPrime = false;

然后在第二次迭代之后它将停止为isPrime然后设置为false,这样效率更高。

我希望你明白。