使用数组存储素数
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("");
}
}
这是我的程序,它应该创建一个数组并将素数初始化给它。然后应该打印素数,但程序只保留 运行.
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("");
}
}