Prime Sieve 仅打印整数 1-3
Prime Sieve only prints integers 1-3
最近,我一直在尝试创建一个程序来打印素数,直到达到用户指定的整数,该程序本身包括一个 "PrimeCheck" class、一个 "PrimeSieve" class 之类的,还有 "Main" class:
public class PrimeCheck {
boolean result;
public PrimeCheck() {
result = true;
}
public boolean primeCheck (int num) {
int i, num1 = num - 1;
for (i = num1; i > 1; i--) {
if (num % i == 0) {
result = false;
}
}
return result;
}
}
import java.util.ArrayList;
public class PrimeSieve {
public PrimeSieve() {
}
PrimeCheck PCObj = new PrimeCheck();
ArrayList<Integer> primes = new ArrayList<Integer>();
public void primeSieve(int num) {
int[] arr = new int[num];
for (int i = 0; i < num; i++) {
arr[i] = i + 1;
if (PCObj.primeCheck(arr[i]) == true) {
primes.add(arr[i]);
}
}
for (int c = 0; c < primes.size(); c++) {
System.out.print(primes.get(c) + " ");
}
}
}
import java.util.Scanner;
public class PrimeSieveMain {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
PrimeSieve PSObj = new PrimeSieve();
System.out.println("Prime Sieve");
System.out.print("Limit: ");
int limit = input.nextInt();
PSObj.primeSieve(limit);
}
}
请原谅我的经验不足,但我似乎无法在这个程序中找到问题。
当你得到的数不是质数时:
public boolean primeCheck (int num) {
int i, num1 = num - 1;
for (i = num1; i > 1; i--) {
if (num % i == 0) {
result = false;
}
}
return result;
}
结果变成假的,永远不会改变,所以我建议:
public boolean primeCheck (int num) {
result=true;
int i, num1 = num - 1;
for (i = num1; i > 1; i--) {
if (num % i == 0) {
result = false;
}
}
return result;
}
在你开始判断素数之前,你应该假设它是一个素数
未经测试,只是一个想法
PrimeCheck 有几个设计问题,首先是您将 result
变量设计为成员,并且它在构造时仅初始化为 true,但在 primeCheck() 中更新为 false。一旦它 return 为 false,它将在 所有后续调用 .
上 return false
也没有必要把result设计成成员,因为result只和方法primeCheck()有关,所以直接改成return的值,去掉成员:
public class PrimeCheck {
public boolean primeCheck (int num) {
for (int i = num - 1; i > 1; i--) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
由于 PrimeCheck 现在没有剩余状态,该方法也可以设为静态,从而使程序中的 PrimeCheck 实例变得多余。您可以只调用静态方法。
PrimeCheck 的效率也非常低,这是由于多种设计选择——一个是您从 (num - 1) 开始测试,但最常见的除数是 最小的 数字。因此,从低端开始测试并循环 向上 会更有效。上限 (num - 1) 也选择不当。 num 的可能最大除数是 num 的平方根,因此上限应该是那个。
您的问题在 PrimeCheck
class。 class 有一个名为 result
的 状态变量 (一个字段)。只要对象是 "alive".
,状态变量就会保留调用之间的值
因此,只要您输入的数字不是 prime
,就可以将此 result
设置为 false
。该值将保留且永远不会更改。
result
变量应该是局部变量,不是状态变量,在方法的开头应该设置为true
.这样每次都会重新开始。
其他说明:
PrimeCheck
class真的没有意义。它并不代表真正的"entity",并且该方法可以很容易地添加到PrimeSieve
class。为不同的实体创建 classes 是一个很好的做法,但我认为在这种情况下没有意义 - 它只有一个功能并且该功能不依赖于它的参数。
- 如果您打算表示 Sieve of Eratosthenes 那么这不是正确的算法。这是一种朴素的算法——它只是单独测试每个数字,并没有像真正的 Sieve 那样删除之前素数的倍数。
最近,我一直在尝试创建一个程序来打印素数,直到达到用户指定的整数,该程序本身包括一个 "PrimeCheck" class、一个 "PrimeSieve" class 之类的,还有 "Main" class:
public class PrimeCheck {
boolean result;
public PrimeCheck() {
result = true;
}
public boolean primeCheck (int num) {
int i, num1 = num - 1;
for (i = num1; i > 1; i--) {
if (num % i == 0) {
result = false;
}
}
return result;
}
}
import java.util.ArrayList;
public class PrimeSieve {
public PrimeSieve() {
}
PrimeCheck PCObj = new PrimeCheck();
ArrayList<Integer> primes = new ArrayList<Integer>();
public void primeSieve(int num) {
int[] arr = new int[num];
for (int i = 0; i < num; i++) {
arr[i] = i + 1;
if (PCObj.primeCheck(arr[i]) == true) {
primes.add(arr[i]);
}
}
for (int c = 0; c < primes.size(); c++) {
System.out.print(primes.get(c) + " ");
}
}
}
import java.util.Scanner;
public class PrimeSieveMain {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
PrimeSieve PSObj = new PrimeSieve();
System.out.println("Prime Sieve");
System.out.print("Limit: ");
int limit = input.nextInt();
PSObj.primeSieve(limit);
}
}
请原谅我的经验不足,但我似乎无法在这个程序中找到问题。
当你得到的数不是质数时:
public boolean primeCheck (int num) {
int i, num1 = num - 1;
for (i = num1; i > 1; i--) {
if (num % i == 0) {
result = false;
}
}
return result;
}
结果变成假的,永远不会改变,所以我建议:
public boolean primeCheck (int num) {
result=true;
int i, num1 = num - 1;
for (i = num1; i > 1; i--) {
if (num % i == 0) {
result = false;
}
}
return result;
}
在你开始判断素数之前,你应该假设它是一个素数
未经测试,只是一个想法
PrimeCheck 有几个设计问题,首先是您将 result
变量设计为成员,并且它在构造时仅初始化为 true,但在 primeCheck() 中更新为 false。一旦它 return 为 false,它将在 所有后续调用 .
也没有必要把result设计成成员,因为result只和方法primeCheck()有关,所以直接改成return的值,去掉成员:
public class PrimeCheck {
public boolean primeCheck (int num) {
for (int i = num - 1; i > 1; i--) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
由于 PrimeCheck 现在没有剩余状态,该方法也可以设为静态,从而使程序中的 PrimeCheck 实例变得多余。您可以只调用静态方法。
PrimeCheck 的效率也非常低,这是由于多种设计选择——一个是您从 (num - 1) 开始测试,但最常见的除数是 最小的 数字。因此,从低端开始测试并循环 向上 会更有效。上限 (num - 1) 也选择不当。 num 的可能最大除数是 num 的平方根,因此上限应该是那个。
您的问题在 PrimeCheck
class。 class 有一个名为 result
的 状态变量 (一个字段)。只要对象是 "alive".
因此,只要您输入的数字不是 prime
,就可以将此 result
设置为 false
。该值将保留且永远不会更改。
result
变量应该是局部变量,不是状态变量,在方法的开头应该设置为true
.这样每次都会重新开始。
其他说明:
PrimeCheck
class真的没有意义。它并不代表真正的"entity",并且该方法可以很容易地添加到PrimeSieve
class。为不同的实体创建 classes 是一个很好的做法,但我认为在这种情况下没有意义 - 它只有一个功能并且该功能不依赖于它的参数。- 如果您打算表示 Sieve of Eratosthenes 那么这不是正确的算法。这是一种朴素的算法——它只是单独测试每个数字,并没有像真正的 Sieve 那样删除之前素数的倍数。