最近,我一直在尝试创建一个打印素数的程序,直到达到用户指定的整数,程序本身包括“PrimeCheck”类,“PrimeSieve”类和“Main”类。类:
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);
}
}
原谅我的经验不足,但我似乎无法在这个程序中找到问题。
答案 0 :(得分:2)
您的问题出在PrimeCheck
课程中。该类有一个名为result
的状态变量(一个字段)。只要对象是“活着的”,状态变量就会保留调用之间的值。
因此,只要您点击的数字不是prime
,就可以将此result
设置为false
。该值保持不变,并且永远不会改变。
result
变量应该是本地变量,而不是状态变量,并且应该在方法开头设置为true
。这样每次都会重新开始。
其他说明:
PrimeCheck
课程中没有任何意义。它不代表真正的“实体”,并且可以轻松地将该方法添加到PrimeSieve
类中。为不同的实体创建类是一个很好的做法,但我认为在这种情况下没有意义 - 它只有一个函数,并且该函数不依赖于任何东西,而是依赖于它的参数。答案 1 :(得分:1)
PrimeCheck有几个设计问题,第一个是你将result
变量设计成一个成员,它只在构造时初始化为true,但在primeCheck()中用false更新。一旦它返回false,它将在所有后续调用上返回false。
它也没有必要将结果设计为成员,因为结果只与方法primeCheck()有关,因此将其更改为直接返回值,从而消除了成员:
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的平方根,所以上限应该是。
答案 2 :(得分:0)
当你得到这个数字不是素数时:
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;
}
在你开始确定素数之前,你应该假设它是素数 没有经过测试,只是一个想法