在计算阶乘,我即使使用long和double也在计算垃圾值

时间:2015-08-01 10:05:49

标签: java long-integer

我在这里发布的程序是marbles from spoj和我的问题  知道这里已经讨论过了,我知道逻辑。

但是当我计算阶乘时,即使计算29阶乘也会溢出。我该怎么办?

不支持long long

package marbles_spoj;

import java.util.Scanner;

public class combinations_with_repetition {

    public static long calc(long n,long k)
    {   
        System.out.println(n+"  "+k);
        long res=0;
        res=factorial(n)/(factorial(k)*factorial(n-k)); 
        return res;
    }

    static long factorial(long n)
    {   long result=1;
        if (n==1||n==0)return 1;
        else 
            for(long i=2;i<n;i++)result=result*i;
    //System.out.println("result is :"+result);
        return result;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub


        Scanner sc = new Scanner(System.in);

        System.out.println("Enter no. of marbles to b picked up");
        long n=sc.nextLong();
        System.out.println("enter no. of colors of marbles availables");
        long r=sc.nextLong();

        System.out.println("Number of combinations possible "+calc(n-1,r-1));
        sc.close();


    }

}

2 个答案:

答案 0 :(得分:2)

我们应该使用BigInteger来计算factorials of large numbers

但是你可能会使用大量的JVM内存。

示例:

public class FactorialUtil
{
    public static BigInteger factorial(int n)
    {
        BigInteger ret = BigInteger.ONE;
        for (int i = 1; i <= n; ++i) ret = ret.multiply(BigInteger.valueOf(i));
        return ret;
    }
}

查看 live demo

答案 1 :(得分:0)

在我看来,双重应该可以工作并给你一个很好的近似值,但你可以使用 java.math 中的 BigInteger 进行任意精度数学运算,这样你就可以了得到准确的数字。