2013-02-07 55 views
1

我想要製作一個void方法,將素數打印到給定的int參數。這是我的,它不工作。使用一種方法打印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'的每次迭代......應該發現它的速度比逐步檢查你已經測試過的許多非素數因子。 – sradforth

回答

6

你永遠不會重置counterouter loop價值。因此,一旦增加,它永遠不會是0,所以,只是在外環的開始復位counter: -

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); 
    } 
} 

不過,我寧願第二個辦法,因爲它分了任務採用不同的方法。所以,這兩種方法都有自己定義的角色。你可以在其他地方很容易地使用它們。請記住,您在不同方法中劃分的任務越多,您獲得的重用性就越高。有一種方法只執行一項任務總是更好。

此外,我建議將方法 - primeCheck重命名爲isPrime,因爲它返回的值爲boolean。所以,只要遵循命名約定,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

這裏是獲取質數,直到在Javascript '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);