2011-06-01 82 views
10

我想比较一个BigInteger(base)的值是否>另一个BigInteger(prime)的值,如果'a'的值不等于1。如果a的值不是1,它应该跳出循环。我应该如何比较它们?如何比较BigInteger的值作为循环中的条件?

Random ran = new Random(); 
    BigInteger prime = new BigInteger(16,ran); 
    BigInteger base,a,one; 
    one = new BigInteger("1"); 

    for (int i = 0; i < 65535; i++){ 

     while (base>prime){ 
      base = new BigInteger(16,ran); 
     } 
     a = base.modPow(prime.subtract(one),prime); 
     System.out.println("a: "+a);  
     if (a != one){ 
      break;   
     } 
    } 

回答

23

您可以使用BigInteger.compareTo(BigInteger)进行比较。

对你而言,这将是while (base.compareTo(prime) > 0) {...}

此外,您的终止条件应该从if (a != one)因为具有相同的整数值2个BigInteger变量改变为if (!a.equals(one))不一定引用相同的对象(它是所有==!=检验)。

6

由于BigInteger是对象,所以在使用相等运算符时应该谨慎。现在,您正在执行参考比较(在这种情况下,这可能会失败)。您需要使用equals()compareTo()方法。

BigInteger有一个内置的静态变量代表一个。使用equals()方法或compareTo()方法来比较值:

if (!a.equals(BigInteger.ONE)) { 
    ... 
} 

- 或 -

if (a.compareTo(BigInteger.ONE) != 0) { 
    ... 
} 

希望帮助!在这里看到更多的信息:http://download.oracle.com/javase/6/docs/api/java/math/BigInteger.html

+2

看起来他既需要的compareTo和equals。看到这里:“...如果'a'的值不等于1,如果a的值不是1,它应该跳出循环。”此外,他的代码显示了他所称的“one”与另一个计算值“a”之间的新BigInteger之间的等同性检查。对不起,过时的链接。 – 2011-06-01 22:21:15

+0

够公平的,我错过了“if(a!= one)”位。 – 2011-06-01 22:26:38

0

也许

while (base.compareTo(prime)>0){ 
//rest of your loop 
}