2012-08-31 6 views
1

목표는 소수가 아닌 모든 배열 스폿을 끄거나 false로 설정하는 것입니다. 배열은 매개 변수로 제공됩니다.Java : Sawve of Eratosthenes : 매개 변수로 배열

a[2] = true; 
a[3] = true; 
a[5] = true; 
a[7] = true; 

이 참으로 그 배열 항목을 재설정 :

public static boolean[] sieveOfEratosthenes(boolean [] a){ 

    int increment= 2; 

    for(int n = 0; n < 9; n++){ 
     for(int i = increment; i < a.length; i += increment){ 
      a[i] = false; 
     } 
     increment += 1; 
    } 
    a[2] = true; 
    a[3] = true; 
    a[5] = true; 
    a[7] = true; 
    return a; 
} 

코드 사용하는 것보다 더 효율적인 방법이 있다면 난 그냥 궁금 해서요, 잘 작동합니다.

미리 감사드립니다.

+0

정의에 따르면 '거짓'이 아닌 모든 지점은 '사실'이어야합니다. 맞습니까? 따라서 전체 배열을 'true'로 초기화 한 다음 소수가 될 수없는 위치를 'false'로 설정하십시오. –

+0

숙제 과제입니다. 배열을 변경할 수 없으며 모두 사실로 설정되어 있습니다. 제공된 배열에 0- * 무한대의 숫자 배열로 가득 찬 것으로 가정합니다. – user1172534

+0

@HunterMcMillen false로 초기화 한 후에 true로 설정하는 것이 적은 작업일까요? 소수가 아닌 것보다 더 많은 소수. –

답변

2

이 작업을 수행하는 좋은 방법은 2. 그래서 루프이

int increment= 2; 

for(int n = 0; n < 9; n++){ 
    for(int i = increment*2; i < a.length; i += increment){ 
     a[i] = false; 
    } 
    increment += 1; 
} 

처럼 당신이 첫 번째를 건너이 방법을 보이는 * 반복에서 루프를 시작하는 것입니다.

둘째로 외부 루프를 수정하여 주요 요소가 제품을 관리했기 때문에 이미 잘못된 값을 무시합니다. 지금 루프는 증가 값

int count = a.length; 

for(int increment = 2; increment < count; increment++){ 
    if(a[increment]) { 
     for(int i = increment*2; i < count; i += increment){ 
      a[i] = false; 
     }   
    } 
} 

이 전류 루프는 하나의 제로가 주요 고려 가정에 대한 귀하의 배열을 통해 모든 규모의 배열 루프를 처리 할 세 번째이

int increment= 2; 

for(int n = 0; n < 9; n++){ 
    if(a[increment]) { 
     for(int i = increment*2; i < a.length; i += increment){ 
      a[i] = false; 
     } 
     increment += 1; 
    } 
} 

것 같습니다. 그래서 a[0] = a[1] = false;을 0과 1이 소수가 아닌 사실을 반영하도록 설정하십시오.

+0

우수 답변! 감사! – user1172534

+0

더 좋은 방법은 int i = increment * increment'에서 루프를 시작하고 모든 * odd * 증가분에 대해 i + = 2 * increment만큼 증가시키는 것입니다. 그런 다음 마지막 루프의 정지 조건을'for (...; increment <= count/increment; ...)'로 변경하십시오. 나는 당신이 결말 문장에서 오타가 있다고 생각한다. 너를 위해 그것을 고쳤다! :) –

관련 문제