使用数组存储素数

Using arrays to store primes

这是我的程序,它应该创建一个数组并将素数初始化给它。然后应该打印素数,但程序只保留 运行.

import java.util.*;
public class primes
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter number of primes ");
        int x = scan.nextInt();
        int[] prime = new int[x];
        int div=2,hold=2;
        int c=0;
        while (prime[x-1]==0)
        {
            for(int a=2; div>a;a++)
            {
                if(div>a && div%a==0)
                a=div;
                else if(div==(a-1))
                hold=div;
            }
            if(div==2||hold!=prime[c-1])
            {
                prime[c]=hold;
                c++;
            }
            div++;
        }
        for(int f =0; f<x;f++)
        System.out.print(" "+prime[f]+" ");
    }
}

我尝试更改我的循环,但我就是不知道哪里出了问题

它将继续 运行 因为你有这个:while (prime[x-1]==0)。其中 x 是来自用户的输入。例如说 5,那么 prime[5-1] 最初将始终包含一个 0,而你是 运行 你的 while 循环在此条件下总是会变为真,因此永无止境。还有,你的质数生成逻辑不对!

您的代码有误。首先纠正它,我想你想存储 1 到 N 范围内的素数,其中 N 是用户提供的数字。使用arrayList(可增长)来存储它。

我 运行 你的代码处于调试器模式,我发现了问题。 我用 x=5.

测试了你的程序

在第一次 while 循环迭代结束时,您有:

  • 素数[0] = 2
  • div = 3
  • 坚持=2
  • c = 1

这就是问题所在:

if(div==2||hold!=prime[c-1])
{
    prime[c]=hold;
    c++;
}

这部分将永远不会再到达,因为:

  • div 永远不会递减,所以它总是优于 2。
  • 保持 等于素数[c-1],并且永远不会改变值。

因此素数将始终保持为 : 2 0 0 0 0,并且您的 while 循环将永远不会结束。

像其他人提到的你的逻辑不对,试试这样的:

public static void main(String args[]) {

    Scanner scan = new Scanner(System.in);
    System.out.println("Enter number of primes ");
    int x = scan.nextInt();
    List<Integer> primes = getPrimes(x);
    Integer[] primeArray = primes.toArray(new Integer[primes.size()]);
    for(int i :primes.toArray(primeArray)){ // you could just use for(int i :primes){ if you don't need array
        System.out.print(i + " ");
    }
}

private static List<Integer> getPrimes(int upperLimit) {

    ArrayList primes = new ArrayList();
    for (int i = 2; i < upperLimit; i++) {
        boolean isPrime = true;

        // Is it prime?
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime)
            primes.add(i);
    }
    return primes;
}

以上将打印出输入的数字,因此如果您键入 5,它将打印出 2 3 而不是 5。

下面是另一个 Java 8 的例子,这个会根据输入打印尽可能多的质数,如果你输入 5 你会得到 2 3 5 7 11

public static void main(String args[]) {

    Scanner scan = new Scanner(System.in);
    System.out.println("Enter number of primes ");
    int x = scan.nextInt();
    long[] prime = primes(x).toArray();

    Arrays.stream(prime).forEach(value -> System.out.print(value + " " ));

}


private static LongStream primes(long max) {
    return LongStream.iterate(2, i -> i + 1)
            .filter(PrimeNumber::isPrime)
            .limit(max);
}

private static boolean isPrime(long x) {
    return LongStream.rangeClosed(2, (long)(Math.sqrt(x)))
            .allMatch(n -> x % n != 0);
}

我发现了错误并重写了代码,现在可以使用了。该程序要求用户提供他们想要查看的素数,并在将它们存储在基本整数数组中后打印出来。

import java.util.*;
public class Prime
{
    public static void main(String [] args)
    {
        Scanner scan= new Scanner(System.in);
        int i=0, hold=2, d=2;
        boolean flag = true;
        System.out.println("Enter the number of primes.");
        int[] prime= new int[scan.nextInt()];

        for(;flag;){
            for(int a=2;d>a;a++){
                if(d==(a)||d%a==0){
                break;
                }
                if((d-1)==a){
                hold = d;
                }
            }
            d++;
            if(hold==2 || hold!=prime[i-1]){
            prime[i] = hold;
            i++;
            }
            if(i==prime.length)
            flag= false;
        }
        for(int x=0;x<prime.length;x++)
        System.out.print(prime[x]+" ");
        System.out.println("");
    }
}