Page 82 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 82

05  {
                     06    int i, n;
                     07    int prime[500];                  /* 소수를 저장하는 배열 */
                     08    int ptr = 0;                    /* 이미 얻은 소수의 개수 */
                     09    unsigned long counter = 0;         /* 곱셈과 나눗셈의 실행 횟수 */
                     10    prime[ptr++] = 2;                /* 2는 소수입니다 */
                     11    prime[ptr++] = 3;                /* 3은 소수입니다 */
                     12    for(n = 5; n <= 1000; n += 2) {     /* 홀수만을 대상으로 합니다. */
                     13      int flag = 0;
                                      counter++
                                                 prime[i] * prime[i] <= n
                     14      for(i = 1; counter ++, prime[i] * prime[i] <= n  ; i++) {
                     15        counter++ ;
                               counter++
                     16        if(n % prime[i] == 0) {       /* 나누어떨어지면 소수가 아닙니다. */
                     17          flag = 1;
                     18          break;                     /* 더 이상의 반복은 필요 없습니다. */
                     19        }
                     20      }
                     21      if(! flag)                    /* 마지막까지 나누어떨어지지 않았습니다. */
                     22        prime[ptr++] = n;            /* 배열에 저장합니다. */
                     23    }
                     24    for(i = 0; i < ptr; i++)
                     25      printf("%d\n", prime[i]);
                     26    printf("곱셈과 나눗셈을 실행한 횟수 : %lu\n", counter);
                     27
                     28    return 0;
                     29  }



                   곱셈과 나눗셈의 실행 횟수를 나타내는 변수 counter를 증가하는 부분은 회색 박스로 표시한

                   두 곳입니다. 또한 변수 counter의 값은 아래 두 연산이 실행될 때마다 증가합니다.


                     곱셈     … prime[i] * prime[i]
                     나눗셈 … n % prime[i]



                   이전 버전 2의 계산 횟수(14,622회)와 비교하면 버전 3에서의 계산 횟수는 3,774회로 줄어들
                   었습니다. 버전 1의 프로그램을 버전 2, 버전 3으로 개선했습니다. 알고리즘에 따라 계산 속
                   도가 빨라짐을 실감했을 것입니다. 안쪽 for문의 제어식은 쉼표 연산자(comma operator)를 사

                   용하고 있습니다. 보통 쉼표 식 op1, op2를 평가할 때는 먼저 op1을 평가하고 그 다음에 op2
                   를 평가합니다. 이 식 전체를 평가하여 얻는 값은 오른쪽 피연산자 op2를 평가하여 얻는 자료




                   82   C 알고리즘
   77   78   79   80   81   82   83   84   85   86   87