Java 素数筛只打印整数1-3
最近,我一直在尝试创建一个程序,该程序打印素数直到达到用户指定的整数,该程序本身包括一个“PrimeCheck”类、“PrimeSieve”类排序和一个“Main”类:Java 素数筛只打印整数1-3,java,primes,Java,Primes,最近,我一直在尝试创建一个程序,该程序打印素数直到达到用户指定的整数,该程序本身包括一个“PrimeCheck”类、“PrimeSieve”类排序和一个“Main”类: 请原谅我的经验不足,但我似乎无法在此程序中找到问题所在。当您得到的数字不是素数时: public boolean primeCheck (int num) { int i, num1 = num - 1; for (i = num1; i > 1; i--) { if (num % i =
请原谅我的经验不足,但我似乎无法在此程序中找到问题所在。当您得到的数字不是素数时:
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有几个设计问题,第一个问题是您将
结果
变量设计为一个成员,它仅在构造时初始化为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的平方根,因此上限应该是。您的问题在
PrimeCheck
类中。该类有一个名为result
的状态变量(字段)。只要对象处于“活动”状态,状态变量就会在调用之间保留值
因此,只要您点击的数字不是素数
,您就可以将该结果
设置为假
。该值将保持不变
结果
变量应为局部变量,而不是状态变量,并且应在方法开始时将其设置为true
。这样一来,每次都会焕然一新
其他说明:
- 在
类中确实没有意义。它并不表示真正的“实体”,而且该方法可以很容易地添加到PrimeCheck
类中。为不同的实体创建类是一个很好的实践,但我认为在这种情况下没有意义——它只有一个函数,该函数只依赖于它的参数PrimeSieve
- 如果您想表示,那么这不是正确的算法。这是一个幼稚的算法——它只是单独测试每个数字,并不像真正的筛子那样划掉之前素数的倍数
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;
}
public class PrimeCheck {
public boolean primeCheck (int num) {
for (int i = num - 1; i > 1; i--) {
if (num % i == 0) {
return false;
}
}
return true;
}
}