2012-01-11 76 views
0

我遇到了数组问题。我复制从一本书中这样的代码:区分两个数组索引?

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

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; 
} 

特别是,我无法理解primeIndexi变量之间的差异。 primeIndex是指数组编号,而i是指放入数组中的数字。对?

+0

任何人都知道这个算法的名字? – bacchus 2012-01-11 23:48:48

+0

请注意,当您设置isPrime = false;时,您还可以明智地添加一个break;(和大括号{...})来尽早终止循环。 – 2012-01-12 00:16:17

+0

更糟糕的是:整个布尔(循环不变+ 1/2)'isPrime'可以通过goto消除,而add-to-array可以被压缩为'primes [primeIndex ++] = p;'顺着'p < = 50'测试应该'primeIndex <50' – wildplasser 2012-01-12 00:35:45

回答

3

primeIndex是下一个找到的素数写在prime数组中的位置,也是迄今已知的素数数目。 i是用于审判的主要指标。对于每个候选人,从1开始的i循环(我们不需要尝试primes[0] = 2,因为只检查奇数)到大于候选人平方根的第一个素数的索引。

+0

我明白现在的差异。但看看计算机执行的第一个p数,即5,不会因5/3小于3而终止循环? – user1064913 2012-01-12 00:33:28

+0

测试'p'是否为素数的内部循环终止。然后,由于'isPrime'没有被设置为false,所以'primeIndex'(2)处的'prime'数组被写入5,'primeIndex'递增并且外部循环进入下一轮,将2加到'因此检查7.再次,内循环立即完成,'primes [3] = 7',外循环与'p = 9' ... – 2012-01-12 00:37:46

+0

谢谢。我现在知道了。 – user1064913 2012-01-12 00:39:39