2014-10-13 6 views
-2
public class Lab5{ 
    public static void main(String[] args){ 

    Scanner input = new Scanner(System.in); 

    System.out.print("Please enter N: "); 
    int n = input.nextInt(); 

    System.out.println("The palindrome prime numbers less than " + n + " are: "); 

     for (int x=2; x<n; x++){ 
      if(isPrime(x) && isPalindrome(x)){ 
      System.out.print(x+", "); 
      } 
     } 
    } 
    public static boolean isPrime(int x){ 

     for (int i=2; i<x; i++){ 
      if (x%i ==0)   
      return false; 
     }return true; 
    } 
    public static int reverse(int x){ 

     int ans=0; 
     while (x != 0){ 
      ans = ans*10 + x%10; 
      x=x/10; 
     }return ans; 
    } 
    public static boolean isPalindrome(int x){ 

     if (x%reverse(x) ==0) 
      return true; 
     else return false; 
    } 
} 

거대한 숫자를 N으로 입력 할 때마다 (즉, 1,000,000) 내 프로그램이 무한 루프로 이동합니다. 나는 10 시간 안에 마감 시간 전에 그것을 고칠 수 있도록 도움이 필요하다. 어떤 도움을 주시면 감사하겠습니다.프라임 프론드롬 프로그램이 무한 루프로 바뀝니다

+0

프로그래밍 논리가 좋지 않습니다. '2에서 sqrt (x)'까지 루프를 실행하십시오! –

+1

디버깅을 시도 했습니까? – xxbbcc

+2

당신이 가진 모든 선택 (즉,'StringBuilder'와'reverse()','ListIterator' 등) 중에서 이것은 정확히 최적이 아닙니다. 정말로 이것을 사용하고 여기에 덤핑하는 대신 일어나는 일을 찾으려면 코드를 디버깅해야합니다. – Mena

답변

0

무한 루프가 아니라 느리고 느리게 진행됩니다.

mor 피드백의 경우, System.out.flush()을 사용하여 조금 더 느리게 만들 수 있습니다. 이로 인해 내부적으로 버퍼링 된 행이 표시됩니다.

 System.out.print(x+", "); 
     System.out.flush(); 

이제 내 이해에 isPalindrome는해야한다 :

return x == reversed(x); 

에 관한 속도 : isPalindrome 빠르게 될 것입니다 :

 if(isPrime(x) && isPalindrome(x)){ 

는 이유

 if (isPalindrome(x) && isPrime(x)) { 

해야한다 훨씬 빠르다. &&은 왼쪽이 거짓 인 경우 오른쪽을 평가하지 않습니다. 그리고 심지어 소수보다 더 작은 문장이 있습니다.

작은 일 :

 x=x/10; 

 x /= 10; 

어쩌면 여기

int sqr = (int)Math.sqrt(x); 
    if (2 <= sqr) { 
     if (x % 2 == 0)   
      return false; 
    } 
    for (int i = 3; i <= sqr; i += 2) { 
     if (x % i == 0)   
      return false; 
    } 
    return true; 
+0

고맙습니다. 세 가지 대답 중 하나가 내가 찾고있는 것입니다. 제곱근 함수에 대해 더 자세히 설명해 주시겠습니까? 나는 왜 내가 'x'를 정사각형으로 만들어야하는지 이해하지 못한다. –

+0

@ArcRanges 만약 그 수가 소수가 아니라면 제곱근만큼이나 큰 요소가 있어야한다는 생각입니다. 다시 말해, 제곱근보다 작거나 같은 1 또는 x 이외의 요소가 없다는 것을 알고 있으면 다른 요인이 전혀 없다고 결론을 내릴 수 있습니다. –

+0

Else :'x == u * v'의 경우 임의로'u <= v'라고 가정하고'u' 만 시도한 다음'x> = u²' 만 따라서'u <= square root (x)'. –

0

코드가 작성 될 수있다. 다음에 게시 할 때 모든 시도를 나열해야합니다. 그것은 사람들에게 여기에 인상을 줄 것입니다, 당신은 단지 그것을 내 버리기보다는 무언가를 시도했습니다. 출력은

public class Lab5{ 
    public static void main(String[] args){ 

// Scanner input = new Scanner(System.in); 

// System.out.print("Please enter N: "); 
// int n = input.nextInt(); 
     int n = 1000000;  
     long startTime = System.currentTimeMillis(); 
    System.out.println("The palindrome prime numbers less than " + n + " are: "); 

     for (int x=2; x<n; x++){ 
      if(isPrime(x) && isPalindrome(x)){ 
      System.out.print(x+", "); 
      } 
     } 
     long endTime = System.currentTimeMillis(); 

     System.out.println("the elapsed time is " + (endTime - startTime) + " milliseconds."); 
    } 
    public static boolean isPrime(int x){ 

     for (int i=2; i<Math.sqrt(x); i++){ 
      if (x%i ==0)   
      return false; 
     }return true; 
    } 
    public static int reverse(int x){ 

     int ans=0; 
     while (x != 0){ 
      ans = ans*10 + x%10; 
      x=x/10; 
     }return ans; 
    } 
    public static boolean isPalindrome(int x){ 

     if (x%reverse(x) ==0) 
      return true; 
     else return false; 
    } 
} 

Ans By의,

/home/ubuntu/workspace/New Folder (master) $ java Lab5 
The palindrome prime numbers less than 1000000 are: 
2, 3, 4, 5, 7, 9, 11, 101, 121, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929, 10201, 10301, 10501, 10601, 11311, 11411, 12421, 12721, 12821, 13331, 13831, 13931, 14341, 14741, 15451, 15551, 16061, 16361, 16561, 16661, 17471, 17971, 18181, 18481, 19391, 19891, 19991, 30103, 30203, 30403, 30703, 30803, 31013, 31513, 32323, 32423, 33533, 34543, 34843, 35053, 35153, 35353, 35753, 36263, 36563, 37273, 37573, 38083, 38183, 38783, 39293, 70207, 70507, 70607, 71317, 71917, 72227, 72727, 73037, 73237, 73637, 74047, 74747, 75557, 76367, 76667, 77377, 77477, 77977, 78487, 78787, 78887, 79397, 79697, 79997, 90709, 91019, 93139, 93239, 93739, 94049, 94249, 94349, 94649, 94849, 94949, 95959, 96269, 96469, 96769, 97379, 97579, 97879, 98389, 98689, 
**the elapsed time is 488 milliseconds.** 
0

는 그이 infinte 루프에가는 것 같아요. 그냥 소수를 확인하는 데 시간이 걸립니다. 한 가지 빠른 팁은 상태가 더 빠른 결과를 낼 것인지의 순서를 변경합니다. if(isPrime(x) && isPalindrome(x)) 대신 if (isPalindrome(x) && isPrime(x))으로 시도하십시오. 프라임 계산은 회검을 확인하는 것보다 더 많은 반복이 필요합니다.

두 번째로 palindrome 확인 로직이 잘못되었습니다. x%reverse(x) == 0 항상 palindrome 줄. 예를 들어 100이라고 말하십시오. 역방향은 001입니다. 그런 다음 100 % 001 == 0입니다. 이것은 회문이 아닙니다. 변경하려면 x == reverse(x)

+0

만약 x = 100이라면, 그것은 주요한 것이 아니기 때문에 카운트하지 않을 것입니까? 하지만 어쨌든 x == reverse (x)에 대해 더 자세히 설명 할 수 있습니다. –