java: как работать с циклом в случае BigInteger

18

Я хочу взять Input от пользователя как Big-Integer и обработать его в цикле For

BigInteger i;
for(BigInteger i=0; i<=100000; i++) {
    System.out.println(i);
}

Но это не сработает

Может ли кто-нибудь помочь мне.

    
задан Sanjeev 11.06.2010 в 17:43
источник
  • Переформатированный код; пожалуйста, верните, если это неверно. –  trashgod 11.06.2010 в 17:47
  • выглядит так странно: он странно растет (i = i + i - 1) ... к тому же он не является <= 1 в начале, поэтому цикл не выполняется вообще ... –  ShinTakezou 11.06.2010 в 17:53
  • BigInteger i объявляется дважды; Я бы подумал, что это не скомпилируется. –  BlairHippo 11.06.2010 в 17:59
  • Я специально не рассмотрел странность вашего фрагмента (другие сделали это), но вместо этого попытайтесь ответить на более общий вопрос, касающийся использования BigInteger. Если вы можете объяснить, что вы делаете, я могу видеть, есть ли что-то, что мы могли пропустить. –  polygenelubricants 11.06.2010 в 18:17

3 ответа

40

Вместо этого вы используете этот синтаксис:

BigInteger i = BigInteger.valueOf(100000L);  // long i = 100000L;
i.compareTo(BigInteger.ONE) > 0              // i > 1
i = i.subtract(BigInteger.ONE)               // i = i - 1

Итак, вот пример объединения:

    for (BigInteger bi = BigInteger.valueOf(5);
            bi.compareTo(BigInteger.ZERO) > 0;
            bi = bi.subtract(BigInteger.ONE)) {

        System.out.println(bi);
    }
    // prints "5", "4", "3", "2", "1"

Обратите внимание, что использование BigInteger в качестве индекса цикла является очень нетипичным. long обычно достаточно для этой цели.

Ссылки API

Идентификатор compareTo

Из документации:

  

Этот метод предоставляется в предпочтении отдельным методам для каждого из шести операторов булевого сравнения ( < , == , > , >= , != , <= ). Предложенная идиома для выполнения этих сравнений: ( x.compareTo(y) <op> 0 ), где <op> является одним из шести операторов сравнения.

Другими словами, учитывая BigInteger x, y , это идиомы сравнения:

x.compareTo(y) <  0     // x <  y
x.compareTo(y) <= 0     // x <= y
x.compareTo(y) != 0     // x != y
x.compareTo(y) == 0     // x == y
x.compareTo(y) >  0     // x >  y
x.compareTo(y) >= 0     // x >= y

Это не относится к BigInteger ; это применимо к любому Comparable<T> в целом.

Примечание по неизменяемости

BigInteger , как String , является неизменным объектом. Начинающие имеют тенденцию совершать следующую ошибку:

String s = "  hello  ";
s.trim(); // doesn't "work"!!!

BigInteger bi = BigInteger.valueOf(5);
bi.add(BigInteger.ONE); // doesn't "work"!!!

Поскольку они неизменяемы, эти методы не мутируют объекты, на которые они вызывают, а вместо этого возвращают новые объекты, результаты этих операций. Таким образом, правильное использование выглядит примерно так:

s = s.trim();
bi = bi.add(BigInteger.ONE);
    
ответ дан polygenelubricants 11.06.2010 в 17:46
источник
  • Итак, это будет итерация от 5 до 1. Но что, если я хочу написать цикл for, который выполняет итерацию от 0 до 4, содержащий пять значений. Я могу это сделать ? –  Lokesh 13.10.2016 в 19:29
3

Ну, во-первых, у вас есть две переменные, называемые «i».

Во-вторых, где пользовательский ввод?

В-третьих, i = i + i распаковывает i в примитивное значение, возможно, переполняет его и помещает результат в новый объект (то есть, если оператор даже компилирует, которого я не проверял).

В-четвертых, i = i + i можно записать в виде i = i.multiply (BigInteger.valueof (2)).

В-пятых, цикл никогда не запускается, потому что 100000 & lt; = 1 является ложным.

    
ответ дан Justin K 11.06.2010 в 17:59
источник
  • В BigInteger нет автобоксинга / распаковки. –  polygenelubricants 11.06.2010 в 18:25
1

Я думаю, что этот код должен работать

public static void main(String[] args) {
    BigInteger bigI = new BigInteger("10000000");
    BigInteger one = new BigInteger("1");

    for (; bigI.compareTo(one) == 0; bigI.subtract(one)) {
       bigI = bigI.add(one);
    }
}
    
ответ дан vodkhang 11.06.2010 в 17:52
источник
  • bigI.subtract (один) на самом деле ничего не делает –  polygenelubricants 11.06.2010 в 18:27
  • да, извините, он должен отменить bigI к результату –  vodkhang 11.06.2010 в 18:36