Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigInteger的比较不起作用_Java_Biginteger - Fatal编程技术网

Java BigInteger的比较不起作用

Java BigInteger的比较不起作用,java,biginteger,Java,Biginteger,我没有得到我期望的结果。这是一个素性测试。我真的不知道怎么了。要么我的循环工作不正常,要么这不正常 n是一个大整数。它是由用户输入的长度随机生成的 public static boolean isPrime(BigInteger n) { BigInteger zero = new BigInteger("0"); BigInteger one = new BigInteger("1"); BigInteger two = new BigInteger("2");

我没有得到我期望的结果。这是一个素性测试。我真的不知道怎么了。要么我的循环工作不正常,要么这不正常


n是一个大整数。它是由用户输入的长度随机生成的

public static boolean isPrime(BigInteger n) {

    BigInteger zero = new BigInteger("0");
    BigInteger one = new BigInteger("1");
    BigInteger two = new BigInteger("2");
    BigInteger three = new BigInteger("3");

    System.out.println(n + " Mod 2 " + n.mod(two));

    if (n.compareTo(one) == 0 || n.compareTo(one) < 0) {
        //System.out.println("HIT1");
        return false;
    } else if (n.compareTo(three) == 0 || n.compareTo(three) < 0) {
        //System.out.println("HIT2");
        return false;
    } else if ((n.mod(two)).compareTo(zero) == 0 || (n.mod(three)).compareTo(zero) == 0) {
        //System.out.println("HIT3");
        return false;
    } else {
        System.out.println("Heres n : " + n);
        return true;
    }
}

不要测试
compareTo()
的结果是否等于-1。当你想表示
a
时,你应该将
a.compareTo(b)<0
。始终与0比较,而不是任何其他常数。

刚刚意识到问题所在。我在循环中和循环内部生成两个不同的数字。我还在循环中错误地分配了BigInteger。我应该做什么
num1=新的BigInteger(generateNumber(p).toString()

首先,测试数字是否为
2
(如果是,则为素数)。接下来,测试该数字是否可被
2
整除(如果是,则它不是素数)。接下来,以
2
的增量从
3
迭代到数字的平方根,测试与原始数字的可除性(如果是,则它不是素数)。否则,该数字为素数。大概

public static boolean isPrime(BigInteger n) {
    final BigInteger two = new BigInteger("2");
    if (n.equals(two)) {
        return true;
    }
    if (n.mod(two).equals(BigInteger.ZERO)) {
        return false;
    }
    for (BigInteger i = two.add(BigInteger.ONE); i.multiply(i).compareTo(n) < 1;
                i = i.add(two)) {
        if (n.mod(i).equals(BigInteger.ZERO)) {
            return false;
        }
    }
    return true;
}
public静态布尔值isPrime(biginger n){
最终的BigInteger 2=新的BigInteger(“2”);
如果(n等于(2)){
返回true;
}
if(n.mod(2).equals(BigInteger.ZERO)){
返回false;
}
对于(biginger)i=2.add(biginger.ONE);i.multiply(i).compareTo(n)<1;
i=i.add(两个)){
if(n.mod(i).等于(BigInteger.ZERO)){
返回false;
}
}
返回true;
}

什么是
n
首先?而且,我在这里没有看到任何循环!你给出了什么样的输入,你得到了什么样的输出,以及该输出如何不符合你的期望?n是一个大整数。这是由用户输入的长度随机生成的。我一直得到偶数。有时我甚至得到一个。它不应该输出给第一个IF语句。compareTo(one)=0 | | n.compareTo(one)<0
模式可以简化并优化为
n.compareTo(one)是有意义的,尝试过,但有时我仍然会得到一个。
public static boolean isPrime(BigInteger n) {
    final BigInteger two = new BigInteger("2");
    if (n.equals(two)) {
        return true;
    }
    if (n.mod(two).equals(BigInteger.ZERO)) {
        return false;
    }
    for (BigInteger i = two.add(BigInteger.ONE); i.multiply(i).compareTo(n) < 1;
                i = i.add(two)) {
        if (n.mod(i).equals(BigInteger.ZERO)) {
            return false;
        }
    }
    return true;
}