请帮助......我的实现是用Java来计算它应该做什么的素数?

时间:2010-11-28 17:14:49

标签: java arraylist

我已经了解了如何使用Java实现素数生成器;但我不确定我是否正确地做到了。我希望有人可以给我一些关于如何改进我的实施的一般建议!请不要给我一个答案,因为这是家庭作业,我想自己解决/成为一个更好的程序员/不作弊!

我将在下面发布描述和我的解决方案,基本上我只想知道一些一般的事情 - 我是否正确地遵循了指示(最重要的是因为我发现语言使用有点混乱)以及我是否可以制作我的程序任何更好的(如果是这样一些一般的提示会很好,所以我可以弄清楚如何...我认为我对对数的使用是远离的,但我想不出更好的方法来使用它)!

如果不允许,请道歉 - 如果不允许,请忽略或删除!非常感谢您的帮助! :)

描述:

  

Prime(int initialCapacity):该类   构造函数。的目的   构造函数是计算和存储   第一个initialCapacity prime第一个initialCapacity primefirst initialCapacity primefirst i   数字。这个想法是你计算的   数字一次并存储它们   你可以重复使用它们几个   倍。你应该使用ArrayList   存储素数。算法   用于计算素数是   在下一节中提供。

     
      
  1. 从一个空的素数列表开始。您可以代表此列表   使用ArrayList。

  2.   
  3. 虽然ArrayList的大小不等于n,但请考虑下一个   候选素数。最初,   下一个候选素数应该是   2,但否则应该是   前任候选人的继任者   素数。

  4.   
  5. 如果候选素数是素数,则将其添加到列表中。

  6.   
  7. 继续第2步。

  8.         

    请注意,此算法建议您   应该使用while循环。第3步   以前的算法要求你   知道如何决定一个给定的   候选素数,c> 1,是一个素数   数。事实上,   已经存在素数的否定   建议一个天真的算法。对于   例如,您可以使用while循环   检查c%i 6 = 0表示所有正数   整数i使得1<我和我< C。   但是,不难看出这一点   一个更好的方法是确保   对于所有素数,c%p 6 = 0   p使得p

我的解决方案如下:

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中,因为问题...我只是不确定我是否完全按照问题说的那样完成。它可能更像是一整天学习并且比其他任何东西都有点磨损的产品!

非常感谢帮助和阅读所有这些;抱歉这篇长篇文章。

2 个答案:

答案 0 :(得分:2)

您可以用以下方式回答您自己的问题:

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

如果这些不在您的列表中,则代码无法正确执行。

你想读这个:

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

答案 1 :(得分:1)

您的解决方案与问题描述并不完全匹配。

问题描述规定了素性测试(即给定候选素数,测试它是否为素数)。它还需要initialCapacity素数。

您的解决方案存在的问题:

  1. 似乎是在尝试进行筛选
  2. 效率低,因为合数的倍数被划掉。
  3. 它会找到initialCapacity(不是第一个initialCapacity素数 - 的素数,以查看差异,尝试initialCapacity = 1)。