2012-01-11 6 views
0

配列に問題があります。私はこの本から、このコードをコピー:特に2つの配列インデックスを区別しますか?

#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

+0

'isPrime = false;'を設定すると、早期にループを終了させるために 'break;'(と中カッコ{{}})を追加することもできます。 –

+0

さらに悪いことに、boolean(ループ不変式+ 1/2)の 'isPrime'はgotoによって取り除かれ、add-to-arrayは' primes [primeIndex ++] = p; 'BTW' p < = 50'テストは 'primeIndex <50'でなければなりません – wildplasser

答えて

3

primeIndexは、次の見つかった素数がprime配列に書かれている場所であり、それまでに知られている素数の数です。 iは試算分割に使用される素数のインデックスです。各候補について、は1からのループです(奇数のみがチェックされているので、primes[0] = 2を試す必要はありません)。候補の平方根より大きい第1の素数のインデックスになります。

+0

私は今、その違いを理解しています。しかし、コンピュータが実行する最初のp番号(5である)を見ると、5/3が3未満であるためループが終了しないでしょうか? – user1064913

+0

'p'がプライムであるかどうかをテストする内部ループは終了します。次に、 'isPrime'がfalseに設定されていないので、' primeIndex'(2)の 'prime'配列に5が書き込まれ、' primeIndex'がインクリメントされ、外側ループが ' p 'をチェックして7をチェックします。もう一度内部ループが終了し、' primes [3] = 7'、 'p = 9'の外側ループ... –

+0

ありがとうございます。今、私は分かる。 – user1064913

関連する問題