2016-06-14 2 views
3

Итак, я создаю факториальную программу, используя класс BigInteger. Но я все время получаю ошибку выше.Конструктор BigInteger (long) не отображается

public static BigInteger fact(long n){ 
     BigInteger result = BigInteger.ONE; 
     for(int i = 1; i <= n; ++i){ 
      result = result.multiply(new BigInteger(i)); 
     } 
     return result; 
} 

Я уже нашел исправление, которое просто добавляет пустую строку с результатом.

result = result.multiply(new BigInteger(i + ""))

Мой вопрос, почему мы должны добавить, что пустую строку?

+0

Почему у вас есть 'long' как ваш параметр,' int' как переменная цикла и 'BigInteger' для умножения? Предельным фактором здесь является переменная цикла ('int'), поэтому другие могут также быть' int 's –

ответ

9

Согласно оракула документации, BigInteger не имеет конструктор, который принимает Int в качестве аргумента

Во-вторых, вы должны использовать BigInteger.valueOf(i); вместо new BigInteger(i + "")

0

BigInteger не имеет конструктор, который принимает int. Путем добавления пустой строки i преобразуется в String.

Вы также могли бы сделать что-то вроде new BigInteger(String.valueOf(i))

Edit: Почему вы должны использовать String? BigInteger (обычно) используется, если вам нужны более крупные значения, чем Integer.MAX_VALUE или даже Long.MAX_VALUE. Итак, если вы хотите создать BigInteger, который имеет значение, большее этого, вам необходимо передать его как объект/переменную, которая может удерживать это значение. И String способен удерживать его.

1

Когда вы добавляете пустую строку в свой конструктор, java-компилятор преобразует ваш параметр в строку: 5 + "" -> "5". в результате в java будет использоваться конструктор BigInterger с параметром String. Вот почему ваш код работает.

/** 
    * Translates the decimal String representation of a BigInteger into a 
    * BigInteger. The String representation consists of an optional minus 
    * sign followed by a sequence of one or more decimal digits. The 
    * character-to-digit mapping is provided by {@code Character.digit}. 
    * The String may not contain any extraneous characters (whitespace, for 
    * example). 
    * 
    * @param val decimal String representation of BigInteger. 
    * @throws NumberFormatException {@code val} is not a valid representation 
    *   of a BigInteger. 
    * @see Character#digit 
    */ 
    public BigInteger(String val) { 
     this(val, 10); 
    } 

Таким образом, чтобы использовать чистый использование кода это:

new BigInteger(Integer.toString(i), 10) 
1

123+"" является такой же, как Integer.toString(123)+"" т.е. добавляя пустую строку в целое число является преобразование, что целое число в строку.

И согласно docs BigInteger имеет конструктор, который принимает десятичную строку целого в качестве аргумента.

И как упоминалось SpringLearner BigInteger не имеет конструктора, который принимает только int в качестве аргумента.

2

Он показывает правильную ошибку. Если вы посмотрите на the BigInteger class in the documentation, вы увидите, что нет конструктора, который принимает int. Таким образом, вы не можете создать объект BigInteger, используя new и передавая int.

Существует конструктор, который принимает строку, и, добавив пустую строку, вы производите свой int в строку.

Вы можете использовать следующий код:

int myint = 5; // For example 
BigInteger myBigInter = BigInteger.valueOf(myint); 
1

BigInteger конструктор с длинным является частным, поскольку разработчик библиотеки хочет, чтобы вы вызвать BigInteger.valueOf(long l). Причина, почему конструктор является частным предоставляется в Javadoc из valueOf,

Возвращает BigInteger, значение которого равна указанной {@code длинной}. Этот «статический заводский метод» предоставляется в предпочтении конструктору ({@code long}), поскольку он позволяет повторно использовать часто используемые BigIntegers.

Смежные вопросы