2013-04-07 5 views
1
public static void algorithmOne(int n){ 

     long startTime = System.currentTimeMillis(); 

     search: 
     for (int possiblePrime = 2; possiblePrime <= n; possiblePrime++){ 

     for (int divisor = 2; divisor < possiblePrime; divisor++) 
      if (possiblePrime%divisor == 0 && possiblePrime != divisor) 
       continue search; 

     System.out.println(possiblePrime); 
     } 
     long endTime = System.currentTimeMillis(); 
     System.err.println(endTime - startTime); 
    } 

이것은 "System.err.println (endTime - startTime);에 도달하지 못하는 이유가 무엇인지 알아낼 수없는 소수를 찾는 방법입니다." 선.왜 내 stderr println 후에 내 stderr println을 보지 못합니까?

+0

귀하의 의견은 무엇입니까? – Ofiris

+0

정수 2에서 N까지의 모든 소수를 찾아야 만합니다. – bob

답변

1

이 시간 차이 println()에 도달했으나 예상 한대로 표시되지 않는 것으로 보입니다. 이것은 stderr에 인쇄하기 때문입니다. 따라서 모든 println()을 표준 출력에 추가 할 수 있다는 보장은 없습니다. 대신 stdout에

인쇄 해보십시오 ... 소수성 테스트를위한 알고리즘에 관해서는

는 - (링크가있다) 소수성 결정에 대한 thesequestions를 보라. 또한 this 같은 문제가 아니라 당신이에 관심이있을 수있는 몇 가지 통찰력을 가지고있는 주요 요인을 찾는 설명 특히, 다음 사항을 고려하십시오.

  • 귀하의 내부 루프 만 인 것처럼, sqrt(n)까지 갈 필요 n의 인수는 n/a입니다.
  • 3이 후의 모든 주요 인자는 6n-1 또는 6n + 1 (생각 해보세요) 형식이므로 반복 할 수 있습니다. Sieve of Erathostenes을 생각하면 이러한 '더티 (dirty)'최적화를 추가로 생각할 수 있습니다.

"쉬운 일"이라고 할 수 있습니다. 하지만 정말로, 왜 당신은 심지어 소수 테스트를 직접 작성해야합니까? 사용할 수있는 existing code이 있습니다.

+0

eek :(문제가있는 숫자 2 대신 알고리즘 1을 게시했습니다 .하지만 System.out.err (endTime - System.err.println (endTime - startTime) 대신에 여전히 컴파일 된 프로그램이이 문제로 인해 발생한 모든 문제점을 해결했습니다. – bob

+0

@bob : 소수 테스트에서 꽤 흥미 롭습니다. – einpoklum

1

이 밖으로 시도 :

long startTime = System.nanoTime(); 

    search: for (int possiblePrime = 2; possiblePrime <= 10; possiblePrime++) { 

     for (int divisor = 2; divisor < possiblePrime; divisor++) 
      if (possiblePrime % divisor == 0 && possiblePrime != divisor) 
       continue search; 

     System.out.println(possiblePrime); 
    } 
    long endTime = System.nanoTime(); 
    System.out.println(startTime); 
    System.out.println(endTime); 
    System.out.println("Total time taken is : " + (endTime - startTime));