簡體   English   中英

請幫忙...我在Java中計算素數的實現是否應該做?

[英]Please help…is my implementation for counting prime numbers in Java doing what it should do?

我已經得到了關於如何使用Java實現素數生成器的描述。 但我不確定是否做得正確。 我希望有人能給我一些有關如何改善實施的一般建議! 請不要給我答案,因為這是家庭作業,我想自己破解/成為一個更好的程序員/不要作弊!

我將在下面發布說明和解決方案,基本上我只想了解一些一般性知識-我是否正確遵循了說明(最重要的一點是,我發現使用的語言有點令人困惑)以及是否可以使我的程序變得更好(如果是這樣,那么一些通用技巧將很不錯,這樣我就可以弄清楚...我認為對數的使用尚不完善,但我想不出一種更好的使用方法)!

抱歉,如果不允許這樣做-如果不允許,請忽略或刪除! 非常感謝您的幫助! :)

說明:

Prime(int initialCapacity):類的構造函數。 構造函數的目的是計算和存儲第一個initialCapacity素數-first initialCapacity primefirstinitialCapacity primefirst i數。 這個想法是,您只需計算一次數字並存儲它們,以便您可以多次重復使用它們。 您應該使用ArrayList存儲素數。 下一節將提供一種計算素數的算法。

  1. 從空質數列表開始。 您可以使用ArrayList表示此列表。

  2. 盡管ArrayList的大小不等於n,但請考慮下一個候選素數。 最初,下一個候選質數應為2,否則應為前一個候選質數的后繼。

  3. 如果候選素數是素數,則將其添加到列表中。

  4. 繼續執行步驟2。

請注意,此算法建議您使用while循環。 先前算法的步驟3要求您知道如何確定給定的候選質數c> 1是否為質數。 事實上,素數的定義已經提出了一種朴素的算法。 例如,您可以使用while循環檢查所有正整數i的c%i 6 = 0,使得1 <i和i <c。 但是,很難發現有更好的方法來確保對於所有素數p使得c%p 6 = 0使得p <c。 使用ArrayList中的質數很容易,因為pie.is方法是您應該使用的方法。 再次注意,這建議您使用while循環。 最后,您的實現應該是有效的,並且不要浪費c%p 6 = 0或c%p = 0形式的檢查。因此,對於ArrayList中的某些素數,您應該在c%p = 0時立即停止檢查。

我的解決方案如下:

import java.util.*;
public class Prime {

  public static void main( String[] args ){

  }
  public static void prime( int initialCapacity){
    int index=2;
    int logOfInitialCapacity = initialCapacity / (int)(Math.log(initialCapacity));
    ArrayList<Integer> listOfPrimeNumbers = new ArrayList<Integer>(logOfInitialCapacity);
    boolean[] isPrimeNumber = new boolean[initialCapacity + 1]; // boolean defaults to
    // false

    for (int i=0;i==initialCapacity;i++) {
        isPrimeNumber[index] = true;
      }
      while ( index <= listOfPrimeNumbers.size() )
      {
        if (isPrimeNumber[index]) {
          listOfPrimeNumbers.add(index);
        }
      for (int j = index; j * index <= initialCapacity; j++) {
          isPrimeNumber[index * j] = false;
      }
         // Now mark the multiple of i as non-prime number
        index++;
      }
  }

}

它應該計算質數的第一個initialCapacity並將其按問題的要求保存在arrayList中...我只是不確定我是否按照問題的說做了。 這可能是整日學習,有點疲倦的產物,而不是其他任何東西!

非常感謝您的幫助並閱讀了所有這些內容; 抱歉,很長的帖子。

您可以這樣回答自己的問題:

http://primes.utm.edu/lists/small/1000.txt

如果這些不在列表中,則說明您的代碼未正確執行。

您將要閱讀以下內容:

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

您的解決方案與問題描述不符。

問題描述規定了素數測試(即給定候選素數,測試它是否為素數)。 它還需要initialCapacity素數。

您的解決方案存在的問題:

  1. 它似乎正在嘗試進行篩分
  2. 這是低效率的,因為要刪除一個復合數的倍數。
  3. 它會找到直至initialCapacity的素數(不是第一個initialCapacity素數-要查看差異,請嘗試initialCapacity = 1 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM