2016-03-02 60 views
0

我試圖把在命令行中兩個參數,第一個數字是起點,第二個是多少質數應該在那之後被發現。我需要打印第二個命令參數所說的多次發現的素數。我無法弄清楚如何使它運行正確的時間,然後找到素數。這是我曾嘗試:查找素數

int values = Integer.parseInt(args[0]); 
int loopAmount = Integer.parseInt(args[1]); 

for (int i = 2; i <= loopAmount; i++) { 
    loopAmount++; 
    if (values % i != 0) { 
     values++; 
     System.out.println(i); 
    } 
} 
+0

你爲什麼在2開始?爲什麼增加loopAmount? –

+0

因爲一個這將是永遠整除,所以他donst要檢查 –

+0

因爲[1不是素(http://math.stackexchange.com/questions/120/why-1-is-not-considered以誠待一個素數)。 – callyalater

回答

0

如果我理解正確你想找到十碼原料N-素數應該是非常簡單的:

int X = Integer.parseInt(args[0]); 
int N = Integer.parseInt(args[1]); 
int C = 0; 
while (C < N) 
{ 
    for(int i=2; i< X; i++) 
    { 
     if(X % i == 0){ 
      X++; 
      continue; 
     } 
    } 
    System.out.println(X); 
    X++; 
    C++; 
} 
4

主循環應該是這樣的:

int start = Integer.parseInt(args[0]); 

int count = Integer.parseInt(args[1]); 

for (int candidate = start, i = 0; i < count; ++candidate) { 
    if (isPrime(candidate)) { 
     i++; 
     System.out.println(candidate); 
    } 
} 

我取代了變量名,使他們瞭解他們的目的更有意義。

循環內部,isPrime方法是什麼,你必須執行:如果收到的參數是一個素數,則返回true,否則false

0

優化版本:

// cache already found primes 
final List<Integer> primes = new ArrayList<>(); 

/** 
* Find {@code count} prime numbers starting at {@code start} inclusive 
*/ 
public void findPrimes(int start, int count) { 
    for (int i = 2; count > 0; i++) { 
     if (isPrime(i) && i >= start) { 
      System.out.println(i); 
      count--; 
     } 
    } 
} 

private boolean isPrime(final int i) { 
    int sqrt = (int)Math.sqrt(i); 
    for (int prime : primes) { 
     if (i % prime == 0) { 
      return false; 
     } 
     if (prime > sqrt) { 
      break; 
     } 
    } 
    primes.add(i); 
    return true; 
} 
  1. 我們真的需要檢查除數最多隻開方。
  2. 我們真的需要找只素因子,因爲任何數字都可以寫成一個product of prime numbers