用 MVC 显示素数 Java

Display Prime numbers with MVC Java

我有一个扩展 JFrame 的 Prime class,它有一个用于显示素数的简单 JSpinner。

我想创建一个无限显示质数的模型(直到 long 结束)。这是模型 class 我写的:

public class PrimeSpinnerModel extends AbstractSpinnerModel{

    long current;

    public PrimeSpinnerModel() {
        this.current = 2;
    }

    @Override
    public Object getValue() {
        return current;
    }

    @Override
    public Object getNextValue() {

        long newLatest = current + 1;

        if(isPrime(newLatest)){
            current = newLatest;
        }else{
            System.out.println(newLatest + "no prime");
            newLatest ++;
            current = newLatest;  
        }
        fireStateChanged(); 
        return getValue();
    }

    @Override
    public Object getPreviousValue() {

        fireStateChanged();
        return getValue(); // without this the component wouldn't know to update.
    }

    @Override
    public void setValue(Object value) {
        throw new IllegalArgumentException("Static spinner model Prime does not support editing.");
    }
    static boolean isPrime(long n) {
        if (n == 1) return false;

        for(long i = 2; i <= n/2; i++)
            if(n % i == 0)
                return false;

        return true;
    }
}

当我 运行 代码时,它显示质数为 2,3,5,7,9,11,13 等

为什么显示9?

假设调用getNextValue()时当前为7。然后 newLatest 设置为 8。isPrime(8) 显然是错误的,所以你增加 newLatest,使其成为 9。你将它分配给 current 和 return 它。这使得 9 成为 7 之后的下一个数字,无论它是否为质数。

要解决这个问题,您应该在 newLatest 不是素数时递增它(在循环中)。这样,您可以确保继续下去,直到找到素数。见下文:

newLatest = current + 1;
while (!isPrime(newLatest)) {
    newLatest++;
}
// newLatest now contains the new prime number.
current = newLatest;
// etc..

试试这个:)

  public static void showPrimeNumbers(int n){
        for (int i=2; i<n; i++){
          boolean istrue = true;
          for (int x=2; x<i; x++){
            if  (i%x==0){
                istrue = false;
            }
           }

           if  (istrue==true){
               System.out.println(i);
            }
        }
    }