Как мне сравнить значения BigInteger, которые будут использоваться в качестве условия в цикле?

#java #biginteger

#java #biginteger

Вопрос:

Я пытаюсь сравнить, является ли значение одного BigInteger (base) > значением другого BigInteger (prime) и не равно ли значение ‘a’ единице. Если значение a не равно 1, оно должно выйти из цикла. Как я должен их сравнивать?

  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;          
        }   
    }
  

Ответ №1:

Вы можете сравнить их с помощью BigInteger.compareTo(BigInteger) .

В вашем случае это было бы while (base.compareTo(prime) > 0) {...} .

Кроме того, ваше условие завершения должно быть изменено с if (a != one) на if (!a.equals(one)) , поскольку две BigInteger переменные с одинаковым целочисленным значением не обязательно ссылаются на один и тот же объект (что является всем этим == и != тестом).

Ответ №2:

Поскольку BigInteger s являются объектами, вам следует соблюдать осторожность при использовании операторов равенства. Прямо сейчас вы выполняете сравнение ссылок (которое в этом случае, скорее всего, завершится неудачей). Вам нужно будет использовать методы equals() или compareTo() .

BigInteger имеет встроенную статическую переменную, представляющую единицу. Используйте equals() метод или compareTo() method для сравнения значений:

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

-или-

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

Надеюсь, это поможет! Смотрите здесь для получения дополнительной информации: http://download.oracle.com/javase/6/docs/api/java/math/BigInteger.html

Комментарии:

1. Похоже, ему нужны как compareTo, так и equals. Смотрите здесь: «…и если значение ‘a’ не равно единице. Если значение a не равно 1, оно должно выйти из цикла.» Кроме того, его код показывает проверку на равенство между созданным им новым BigInteger с именем «one» и другим вычисленным значением «a». Извините за устаревшую ссылку.

2. Справедливо, я пропустил if (a != one) бит.

Ответ №3:

Возможно

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