2012-01-11 2 views
0

배열에 문제가 있습니다. 나는 primeIndexi 변수의 차이를 이해하는 데 문제, 특히두 배열 인덱스를 구별 할 수 있습니까?

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

: 나는 책에서이 코드를 복사됩니다. primeIndex은 배열 번호를 나타내고 i은 배열에있는 번호를 나타냅니다. 권리?

+0

누구든지이 알고리즘의 이름을 알고 있습니까? – bacchus

+0

'isPrime = false;'를 설정할 때, 'break;'(그리고 중괄호'{...}')를 현명하게 추가하여 루프를 일찍 종료시킬 수 있음에 유의하십시오. –

+0

더 나쁘다 : 부울 (loop invariant + 1/2)'isPrime'은 goto에 의해 제거 될 수 있고, add-to-array는'primes [primeIndex ++] = p;'BTW'p < = 50' 테스트는'primeIndex <50'이어야합니다 – wildplasser

답변

3

primeIndexprime 배열에 다음으로 발견 된 소수가 쓰여지는 곳이며, 지금까지 알려진 소수입니다. i은 시험 분할에 사용 된 소수의 색인입니다. 각 후보에 대해 i (후보가 제곱근보다 큰 첫 번째 소수점 색인에 홀수가 선택되었으므로 primes[0] = 2을 시도 할 필요가 없음)의 루프가 1 개에서부터 반복됩니다.

+0

차이점을 이해했습니다. 그러나 5/3이 3보다 작기 때문에 컴퓨터가 실행하는 첫 번째 P 번호 (5는 루프 종료가 아님)를 살펴 보겠습니다. – user1064913

+0

'p'가 소수인지 아닌지를 테스트하는 내부 루프가 끝납니다. 'isPrime'이 false로 설정되지 않았기 때문에, 5는 primeIndex' (2) 장소의'prime' 배열에 쓰여지고,'primeIndex'는 증가하고 다음 라운드로 들어가서' p'를 검사하여 7. 다시 내부 루프가 끝나고'primes [3] = 7','p = 9'가있는 외부 루프 ... –

+0

고맙습니다. 지금은 이해. – user1064913

관련 문제