【问题标题】:What is wrong with my implementation of this algorithm to compute the first N prime numbers?我实现这个算法来计算前 N 个素数有什么问题?
【发布时间】:2010-11-28 23:00:59
【问题描述】:

我认为构造函数在逻辑上是正确的,我只是不知道如何在 main 中调用它! :) 有人可以帮忙吗?如果有人能快速浏览一下我的代码,那就太好了 :) 非常感谢!

另外,我在这个实现中使用了arrayLists,我必须这样做,所以我不想改变它,即使只使用数组更容易实现。

import java.util.*;
public class PrimeNumberss { 
    public static void main(String args []){    
      PrimeNumberss PrimeNumbers = new PrimeNumberss(10);
    }

    public PrimeNumberss (int initialCapacity) {
        ArrayList<Integer> listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);
        long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0
        int start = 2;
        boolean[] isPrimeNumber = new boolean[initialCapacity + 1];

        for (int i=0;i==initialCapacity;i++) {//setting all values in array of booleans to true
        isPrimeNumber[i] = true;
        }

        while (start != initialCapacity)
        {
          if (isPrimeNumber[start])
          {
            listOfPrimeNumbers.add(start);
            //add to array list
            numberOfPrimes++;

            for (int i = start; start < initialCapacity; i+=start)
            {
              isPrimeNumber[i] = false;
            }

          }

          start++;
        }
    }
}

【问题讨论】:

  • 有什么问题?如果您遇到错误,请提供详细信息。如果结果不符合预期,请提供详细信息
  • 看起来你说得很好,到底是什么问题?
  • 抱歉没有详细说明!我想通过打印前 10 个素数来测试我正在调用的构造函数。当我运行它时,它什么也没打印。我知道我忘记了一些愚蠢的事情,但我现在累死了,只是看不到它!
  • 您只会找到小于 N(您的初始容量)的素数,而不是前 N 个素数。
  • 在构造函数末尾尝试System.out.println(listOfPrimeNumbers)

标签: java arraylist primes


【解决方案1】:
  1. 您的算法不正确;您只会找到小于 N(您的初始容量)的素数,而不是前 N 个素数。
  2. 如果要存储每个素数,则应将它们存储在类变量中,而不是构造函数的本地变量中。如果这样做,您将无法在构造函数之外访问它们。
  3. 您应该使用 getter 方法公开列表以提供对它们的访问。
  4. 您没有在构造函数中打印任何内容。

【讨论】:

    【解决方案2】:

    i==initialCapacity 显然是错误的。

    【讨论】:

    • 因为除非 initialCapacity 为零,否则循环永远不会执行。
    【解决方案3】:

    所有重要的东西都在那里,只有微小的变化。现在你得到的素数小于 N,所以如果你想把它改成前 N 个素数,这将是一个真正的功能差异。现在让 N=50 得到超过 10 个素数。

    public class PrimeNumberss { 
    
        private List listOfPrimeNumbers;  //add a member variable for the ArrayList
    
        public static void main(String args []){    
          PrimeNumberss PrimeNumbers = new PrimeNumberss(50);
          PrimeNumbers.print();  //use our new print method
        }
    
    public PrimeNumberss (int initialCapacity) {
        listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity/2);  //initialCapacity/2 is an easy (if not tight) upper bound
        long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0
        int start = 2;
        boolean[] isPrimeNumber = new boolean[initialCapacity + 1];
    
        for (int i=0;i==initialCapacity;i++) {//setting all values in array of booleans to true
        isPrimeNumber[i] = true;
        }
    
      //.... complete the constructor method as you have it.  honestly, i didnt even read it all
    
     public void print()  //add this printout function
     {
         int i = 1;
         it = listOfPrimeNumbers.listIterator();
         while (it.hasNext())
         {
              System.out.println("the " + i + "th prime is: " + it.next());
              i++;
         }
         //or just System.out.println(listOfPrimeNumbers);, letting ArrayList's toString do the work.  i think it will be in [a,b,c,..,z] format
     }
    
     public List getPrimes() {return listOfPrimeNumbers;} //a simple getter isnt a bad idea either, even though we arent using it yet
    }
    

    顺便说一句,命名可能会更好一些(PrimeNumberss 和 PrimeNumbers??),但我没有更改任何内容。此外, intiialCapacity 并不能反映它的真正含义。也许类似于“顶部”。

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 2010-11-10
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2011-04-10
      • 2013-08-27
      • 2015-10-01
      • 2010-12-19
      相关资源
      最近更新 更多