我正在向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
的平方根。
请解释该行
答案 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,这样效率更高。
我希望你明白。