2013-02-07 7 views
1

주어진 int 인수까지 소수를 인쇄하는 void 메소드를 만들려고합니다. 이것은 내가 가진 것이며 작동하지 않습니다.하나의 방법을 사용하여 n 소수를 인쇄

public class listPrimes { 
    public static void main(String[] args) { 
     printPrimes(1000); 

    } 

static void printPrimes(int max) { 
    int counter = 0; 
    for (int i = 2; i <= max; i++) { 
     for (int n = 2; n < i; n++) { 
      if (i % n == 0) { 
       counter++; 
      } 
     } 
     if (counter == 0) { 
      System.out.println(i); 
      counter = 0; 
     } 
    } 
} 
} 

아래의 두 가지 방법으로 원하는 효과를 만들 수 있었지만 하나만 사용하고 싶습니다. 위의 코드에서 무엇이 잘못 되었습니까?

public class listPrimes { 
    public static void main(String[] args) { 
     printPrimes(1000); 
    } 

private static void printPrimes(int max) { 
    for (int i = 2; i <= max; i++) { 
     if (primeCheck(i)) { 
      System.out.println(i); 
     } 
    } 
} 

static boolean isPrime(int check) { 
    for (int i = 2; i < check/2; i++) { 
     if (check % i == 0) { 
      return false; 
     } 
    } 
    return true; 
} 
} 
+2

코드에 어떤 문제가 있습니까? 잘못된 출력입니까? – nhahtdh

+0

첫 번째 방법은 2와 3이 모두 출력되므로 그 이유는 다음과 같습니다! –

+0

나는 이것이 단 하나의 방법을 시도하는 퍼포먼스상의 이유로 기대된다. 만약 발견 된 소수의 레코드를 유지하고 더 큰 'n'의 각 반복에 대한 테스트를한다면 ... 이미 테스트 한 많은 non prime divisors를 점증 적으로 점검합니다. – sradforth

답변

6

당신은 outer loop에서 counter의 값을 다시 설정하지 않습니다. 가 증가되면 그래서, 그것은 그래서, 단지 외부 루프의 시작 부분에 counter를 다시 0 없을 것 - 그것은 분할 이후

그러나
for (int i = 2; i <= max; i++) { 
    counter = 0; 
    for (int n = 2; n < i; n++) { 
     if (i % n == 0) { 
      counter++; 
     } 
    } 
    if (counter == 0) { 
     System.out.println(i); 
    } 
} 

, 나는, 두 번째 방법을 선호 할 것 다른 방법으로 작업. 따라서이 두 메소드에는 정의 된 역할이 있습니다. 그리고 다른 장소에서도 쉽게 사용할 수 있습니다. 다른 방법들간에 작업을 나누면 많을수록 재사용 성이 높아집니다. 한 가지 방법으로 하나의 작업 만 수행하는 것이 항상 좋습니다.

또한 boolean 값을 반환하기 때문에 primeCheckisPrime으로 바꾸는 것이 좋습니다. 따라서 이름 지정 규칙을 따르기 만하면 isPrime이 좋은 이름이됩니다. 성능 향상을 위해

+0

고맙습니다. 지금은 이해. 업데이트 된 코드가있는 작은 점, 카운터 = 0; 두 번째 if 문에서 제거 할 수 있습니다. –

+0

@DavidTunnell. 아니요, 하나는 비교를하는 것이지 할당이 아닙니다. 그것은 필요할 것입니다. –

+0

나는 비교를 언급하지 않는다. 당신이 그것을 업데이트 한 것 같습니다. 어쨌든, 다시 한번 감사드립니다! –

3

하나의 변화는 :

public static void main(String[] args) { 
    printPrimes(100); 
} 

public static void printPrimes(int range) { 
    for (int iCounter=1; iCounter<=range; ++iCounter) { 
     if (iCounter <= 1) continue; 
     if (iCounter == 2 || iCounter == 3) { 
      System.out.println(iCounter); 
      continue; 
     } 
     if (iCounter%2 == 0) continue; 
     int iCounterSqrt = (int) Math.sqrt(iCounter); 

     boolean bPrime = true; 
     for (int iDenom=3; iDenom <= iCounterSqrt; iDenom += 2) { 
      if (iCounter % iDenom == 0) 
       bPrime = false; 
     } 

     if (bPrime) { 
      System.out.println(iCounter); 
     } 
    } 
} 
0
/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package javaapplication4; 

/** 
* 
* @author sahadev & vignesh 
*/ 
class primecollection { 


    public static void main(String[] args) { 
    int r,s=0,k=0; 
     int i,j; 
     int a[] = new int[50]; 
     for(i=2;k<10;i++) 
     { 
     for(j=1;j<=i;j++) 
     { 
     r = i%j; 

     if(r==0) 
     { 
      s++; 
     } 
     if(s==2) 
     { 
      a[k] = i; 
      k++; 
     } 
     } 
     System.out.println(a[k]); 
    } 

} 
} 
+1

코드가하는 일과 게시 이유를 항상 설명하십시오. 코드 전용 답변은 거의 좋은 답변을하지 못합니다. –

-1
public class listPrimes { 
public static void main(String[] args) { 
    printPrimes(1000); 

} 

static void printPrimes(int max) 
{ 

    for(int k=2;k<=max;k++) 
    { 
     int counter=0; 
     for(int i=1;i<=k;i++) 
     { 
      if((k%i)==0) 
      { 
       counter++; 
      } 
     } 
     if(counter==2) 
     { 
      System.out.println(k+"is prime"); 
     } 
    } 
} 

}

0

당신은 많은 수의이을 테스트하는 경우, SQRT를 사용하는 것이 더 효율적이 될 것입니다. 여기 http://www.wikihow.com/Check-if-a-Number-Is-Prime

Scanner reader = new Scanner(System.in); 
    System.out.println("Enter the a number"); 
    int num = reader.nextInt(); 
    int counter = 0; 
    int root = 0; 
    boolean prime_flag; 

    if (2 <= num) { 
     // 2 is the only even prime number 
     counter++; 
    } 

    for (int i = 3; i < (num + 1); i++) { 

     // test only for odd number 
     if (i % 2 != 0) { 
      prime_flag = true; 
      root = (int) (Math.sqrt(i) + 1); 

      for (int j = 3; j < (root + 1); j++) { 
       if ((i % j == 0) && (i != j)) { 

        prime_flag = false; 
        break; 
       } 
      } 

      if (prime_flag) { 
       counter++; 
      } 

     } 

    } 

    System.out.println("Count of prime numbers upto " + num + " is " 
      + counter); 
0

자바 스크립트의 'N'까지 소수를 얻기위한 코드입니다. 최적화 된 코드이므로 코드를 리펙토링 할 수 있습니다. 기본 논리 : 모든 숫자에 대해 우리가 이미 찾은 소수 중에서 나눌 수 있는지를 확인합니다.이 값이 i/2보다 작거나 같을 때까지 찾습니다.

function getPrimesTill(n){ 
    var i, j, len, limit, result = []; 
    for(i=2;i<n;i++){ 
     limit = i/2; 
     len = result.length; 
     isPrime = true; 
     for(j=0;len && result[j]<=limit;j++){ 
      if(i%result[j] == 0){ 
       isPrime = false; 
       break; 
      } 
     } 
     if(isPrime) result.push(i); 
    } 
    return result; 
} 
getPrimesTill(100); 
관련 문제