2015-04-12 164 views
1

我試圖編寫BiggerThanPrime程序,它允許用戶給出一個輸入p,程序可以找到它的下一個最接近的素數(n),使得(n-p)的值最小。我的while循環進入無限循環,出了什麼問題?

這裏是我的代碼:

static boolean Prime (int n){ 
    boolean NotPrime = true; 
    boolean result = true; 
    for (int i=2; i< n; i++){ 
     NotPrime = (n % i != 0); 
     result = (result && NotPrime); 
    } 
    return result; 
} 

//Using Betrand's Postulate which states that there always exists at least one prime p s.t.a< p <2a 
public static void main(String[] args) { 
    int p = Integer.parseInt(args[0]); 
    int k = p+1; 
    while(k > p && k< 2*p){ 
     if(Prime(k) == true){ 
      System.out.println("the next bigger prime than "+ p + " is "+ k); 
     } else{ 
      k++; 
     } 
    } 
} 

但while循環進入無限循環。

這樣的結果是:

the next bigger prime than 20 is 23 
the next bigger prime than 20 is 23 
. 
. 
. 
(infinitely goes on) :(

我在做什麼錯?

+0

好了,它不會改變k或p ...所以'k> p && k <2 * p'保持爲真,所以循環保持循環。 (這就是循環的工作方式) – immibis

+0

看看你的問題,當n = 2時,(n-p)是最小的。我懷疑這不是你想要回答的問題。從你的代碼看來,它似乎是「下一個大於p的素數」。你「最接近」可能低於p。最接近19的素數是17;在19之後的下一個更大的素數是23.確保你正在回答正確的問題。 – rossum

回答

1

你需要打破循環,一旦你得到更大的素數,你也需要在如下每個迭代遞增K:

while(k > p && k< 2*p){ 
    if(Prime(k)){ 
     System.out.println("the next bigger prime than "+ p + " is "+ k); 
     break; 
    }   
    k++; 
} 

而且也請注意爲總理(K)返回一個布爾值,沒有必要再次將它與真實的比較。

1

一旦你找到了下任首相,你應該從迴路斷線:

while(k > p && k< 2*p){ 
     if(Prime(k) == true){ 
      System.out.println("the next bigger prime than "+ p + " is "+ k); 
      break; 
     } else{ 
      k++; 
     }    
    } 
1

,因爲你不是在每次迭代

遞增k試試這個:

while(k > p && k< 2*p){ 
    if(Prime(k) == true){ 
     System.out.println("the next bigger prime than "+ p + " is "+ k); 
    }   
     k++; 
} 
1
while(k > p && k< 2*p){ 
      if(Prime(k) == true){ 
       System.out.println("the next bigger prime than "+ p + " is "+ k); 
      } else{ 
       k++; 
      }    
     } 

一旦Prime(k)返回true,您不會更改k的值,因此循環會繼續。

1

(Prime(k) == true)它永遠不會增加k的值。所以 它會進入無限循環。

你可以改變垂耳在任的這方面

方式1:

while(k > p && k< 2*p){ 
     if(Prime(k) == true){ 
      System.out.println("the next bigger prime than "+ p + " is "+ k); 
     } 
     k++; 
    } 

方式2:

while(k > p && k< 2*p){ 
     if(Prime(k) == true){ 
      System.out.println("the next bigger prime than "+ p + " is "+ k); 
      Break; 
     } else{ 
      k++; 
     } 
    }