선별 법 소수

4744 단어 알고리즘
n 소수 의 정의: n 은 [2, sqrt (n)?] 에서 임의의 정수 로 나 눌 수 없 으 면 n 은 소수 이다.n. 이 방법 으로 n 보다 크 지 않 은 모든 소수 효율 이 너무 낮은 것 을 찾 아 냈 습 니 다. 다음은 소 수 를 구 하 는 전형 적 인 알고리즘 인 선별 법 으로 소 수 를 구 하 는 것 을 소개 합 니 다.
(1) 준비: 길이 가 10000 인 배열 isPrime 을 1 로 초기 화 합 니 다.
(2) 선별: i 는 2 에서 100 까지 한다. i 가 소수 라면 i 의 배 수 를 그 어 낸다. 즉, isPrime [2 * i], isPrime [3 * i].
(3) 출력: i 는 2 에서 10000 까지 합 니 다. 만약 에 isPrime [i] = 1 이면 i 는 소수 이 고 출력 합 니 다.
생각: 왜 한 단계 의 순환 은 i 가 2 에서 100 이 아니 라 i 가 2 에서 10000 까지 입 니까?순환 횟수 감소, 연산 속도 증가

#include<stdio.h>
#include<math.h>
#define N 10000
int isPrime[N+1];
void initPrime()
{
 int  i, k, m;
 for(i=1;i<=N;i++) isPrime[i]=1; /*   */
         m=(int)sqrt(N);
 for(i=2;i<=m;i++) /*    */
 {
       if(isPrime[i]==1)
      for(k=i+i;k<=N; k=k+i)//  i        
    isPrime[k]=0;
 }
}
int main()
{
 int  i;
     initPrime();
 for(i=1;i<=N;i++) /*  10000       */
    {          
         if(isPrime[i]==1)
   printf("%5d",i);   //     i   isPrime[i]
     }
 return 0;
}


/*                          ,         */

#include<stdio.h>
#include<math.h>
#define N 10000
/* N     ,    prm      ,         */
int prime (int prm[]) 
{
int i, prmNum, n;
    int isPrime[N+1]; /*    */
    for(i=0; i<=N; i++) /* isPrime        1*/
           isPrime[i]=1;
    n = (int)sqrt(N);
for(i=2; i<=n; i++)
{
 if(isPrime[i]) /*  i   */
   {
         for(int j=2*i; j<=N; j=j+i) /*          */
         isPrime[j]=0;//  isPrime[i] = 0
    }
}
for(prmNum=0,i=2;i<=N;i++)  /*  IsPrime  */
{
    if(isPrime[i]==1) /*  i   ,      prm*/
         prm[prmNum++]= i ;
}
return prmNum; /*      */
}
int main()
{
  int i, prmNum,  prm[N];
  prmNum=prime(prm); /*        , prmNum     */
  for (i=0;i<prmNum;i++) /*  10000       */
  {
     printf("%5d",prm[i]);
     if(prmNum%10==0) /*    10   */
           printf("
"
); } }

좋은 웹페이지 즐겨찾기