Сложность с BigInteger

Я пытаюсь сделать факториал с рекурсией и BigIntegers, но eclipse жалуется на BigInteger. Я знаю, что программа должна быть простой, но она вызывает у меня головную боль. Вот код.

import java.util.Scanner;
import java.math.BigInteger;

public class Factorial
{
    public static void main(String[] args) 
    {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter integer");
        BigInteger n = input.nextBigInteger();
        System.out.println("Factorial of " + n + " is "  + fact(n));

    }

    public static  int fact(BigInteger n)
    {
        if(n ==0)
        {
            return 1;
        }
        else
        {
            return n * fact(n-1);
        }
    }
}

person user815693    schedule 28.05.2012    source источник


Ответы (4)


BigInteger не поддерживает сравнение с использованием == и умножение с использованием *. Вместо этого вы должны вызвать соответствующие методы класса BigInteger (equals() и multipy()).

Также обратите внимание, что существуют BigInteger.ZERO и BigInteger.ONE.

Наконец, тип возвращаемого значения вашего метода fact должен быть BigInteger, а не int. Хотите ли вы, чтобы аргумент имел тип BigInteger или int, зависит от вас.

person NPE    schedule 28.05.2012
comment
Кроме того, ваш метод factorial, вероятно, должен принимать int и возвращать BigInteger, а не наоборот. - person Louis Wasserman; 28.05.2012

В дополнение к тому, что @aix упомянул о вызове арифметики для BigInteger, я также вижу еще одну проблему с этим кодом.

Ваша подпись метода

public static  int fact(BigInteger n)

Это проблематично - факториал быстро растет, поэтому вы, скорее всего, переполните результат.
Я думаю, что вы действительно хотели:

public static  BigInteger fact(int n)

что имеет гораздо больше смысла, поскольку возвращаемое значение, вероятно, должно быть BigInteger (поскольку оно быстро растет), а не параметром, или, возможно, обоими из них.

person amit    schedule 28.05.2012

Java не поддерживает перегрузку операторов. Таким образом, + и == не могут поддерживаться для пользовательских классов, за одним исключением, которое java.lang.String поддерживает +.

person crybird    schedule 28.05.2012

Я считаю, что вы не можете просто использовать арифметический оператор для объекта BigInteger. Попробуйте использовать их методы для арифметических процессов, таких как сравнение, вычитание, умножение и т. д.

Ссылки даны здесь

person Vincent    schedule 28.05.2012