如何使用堆栈以降序输出素数?

时间:2011-02-15 19:43:08

标签: java stack primes

import java.util.Stack;

public class Primes{
    public static void main(String[]args){
    Stack<Integer> stack = new Stack<Integer>();

    stack.push(null);
    //number of primes to display
    final int NUMBER_OF_PRIMES = 50;
    //number of primes to display per line
    final int NUMBER_OF_PRIMES_PER_LINE = 10;
    //count number of primes
    int count = 0;
    int number = 2;

    System.out.println("The first 50 primes are \n");

    while(count < NUMBER_OF_PRIMES){
        boolean isPrime = true;

    for(int divisor = 2; divisor <= number/2; divisor++){
        if(number % divisor == 0){
            isPrime = false;
            break;
        }
    }
    if(isPrime){
        count++;

        if(count % NUMBER_OF_PRIMES_PER_LINE ==0){
            System.out.println(number);

        }
        else
            System.out.print(number + " ");

    }
    number++;
    }
}
}

4 个答案:

答案 0 :(得分:0)

  1. 阅读javadoc for Stack及其父类:Vector
  2. 计算50个第一主要成员时,不要在找到它们时显示它们,而是将它们存储在堆栈中
  3. 找到素数后,堆栈中包含您找到的所有素数。最小的一个是堆栈的第一个元素,最大的一个是堆栈的最后一个元素。从堆栈末尾开始另一个循环,以降序显示素数。
  4. 注意:Stack是一个不应该再使用的旧类。你应该更喜欢ArrayList。

答案 1 :(得分:0)

因为这是一个家庭作业问题,所以我不会给出代码,但这是一个过程,从代码中的某个地方开始。

  1. 如果number是素数,请将其推入堆栈。
  2. 当寻找器循环终止时,开始从新循环中的堆栈弹出。数字将按降序弹出(因为它们按升序推送)。

答案 2 :(得分:0)

首先,看一下Finding prime numbers with the Sieve of Eratosthenes (Originally: Is there a better way to prepare this array?)讨论更好的寻找素数的方法。然后,根据“后进先出”属性,使用堆栈来颠倒顺序。

答案 3 :(得分:0)

堆栈的一个有趣属性是它可以用于逆序。这是因为要推到它的第一个项目是最后一个关闭。

想象一下,如果我将“pan”这个词的字母逐个推到堆栈上。我首先按“p”,然后按“a”,然后按“n”。现在,因为“n”是推送的最后一个字母,所以它是第一个从堆栈中弹出的字母。所以,当我删除这些字母后,我得到“n”,然后是“a”,然后是“p” - “nap”。以这种方式,可以使用堆栈通过将其视为字符列表来反转单词。

素数列表也是如此。如果您有一个按升序排列的第一个NUMBER_OF_PRIMES素数列表(例如:2,3,5,7 ......),那么您可以使用堆栈执行相同的技巧,将该列表更改为按顺序顺序将每个推入堆栈,然后将其读取。

所以,我要做的就是每次检测到素数时,将它推到堆栈上,直到堆栈上有NUMBER_OF_PRIMES个素数。然后,从堆栈中弹出每个项目,以相反的顺序打印它们。

一旦运行完毕,将isPrime逻辑分解为自己的功能也是值得的。