Java 素数筛只打印整数1-3

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 =

最近,我一直在尝试创建一个程序,该程序打印素数直到达到用户指定的整数,该程序本身包括一个“PrimeCheck”类、“PrimeSieve”类排序和一个“Main”类:



请原谅我的经验不足,但我似乎无法在此程序中找到问题所在。

当您得到的数字不是素数时:

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
    类中。为不同的实体创建类是一个很好的实践,但我认为在这种情况下没有意义——它只有一个函数,该函数只依赖于它的参数
  • 如果您想表示,那么这不是正确的算法。这是一个幼稚的算法——它只是单独测试每个数字,并不像真正的筛子那样划掉之前素数的倍数

首先,谢谢。第二,这并不是埃拉托斯坦筛的真实反映。作为comp-sci的新手,我只是想创建一个原始的算法,可以打印素数直到指定的时间。还有什么其他建议可以提高程序的效率吗?再说一次,我对Java和编程都很陌生,所以我的大部分教学内容都用于学习语言本身,以及学习如何解决使用计算机的基本问题,不要把重点放在算法的效率上。@AlexanderBurka不要太担心效率——你的首要任务应该始终是正确性,而不是速度。性能上的重大飞跃始终是改进算法的结果;或者至少是其中的一部分(例如,消除超级计算,或者保留代价高昂的计算结果供以后重用)。就语言而言,没有太多可供选择的语言;看看java中关键字的数量有多少。每种语言的基本计算/决策语句在功能上几乎是相同的(除了语法上的糖分)。@AlexanderBurka(空间不足)-因此,总之,您应该努力提高算法的效率-这通常是您的努力/时间获得最多回报的地方。优化代码是你最后的选择,当你已经用尽了其他的选择,仍然需要提高速度。谢谢你的提示。但有一个问题并不需要一个全新的线程:关于Java算法的效率,我应该在哪些实例中创建一个类,从而创建该类的实例,而不是简单地声明一个静态方法?@AlexanderBurka静态方法和实例方法有两个方面,后者可以被覆盖(多态性),并且它可以自动访问其其他成员-这需要两项费用,首先必须在某个点创建对象,第二个实例方法调用可能会稍微增加执行成本,因为它们隐式地引用“this”并解析正确的方法(可能是因为虚拟机可以优化一些开销)。静态方法与大多数其他语言函数是等价的。
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;
    }
}