Java 在计算阶乘时,我甚至使用long和double来获取垃圾值

Java 在计算阶乘时,我甚至使用long和double来获取垃圾值,java,long-integer,Java,Long Integer,我在这里发布的程序是一个问题,我 我知道这里已经讨论过了,我知道其中的逻辑 但是当我计算阶乘时,它甚至在计算29阶乘时溢出。我能做什么 不支持long package marbles_spoj; import java.util.Scanner; public class combinations_with_repetition { public static long calc(long n,long k) { System.out.println(

我在这里发布的程序是一个问题,我 我知道这里已经讨论过了,我知道其中的逻辑

但是当我计算阶乘时,它甚至在计算29阶乘时溢出。我能做什么

不支持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();


    }

}
package marbles\u spoj;
导入java.util.Scanner;
公共类组合\u与\u重复{
公共静态长计算(长n,长k)
{   
系统输出打印项次(n+“”+k);
长res=0;
res=阶乘(n)/(阶乘(k)*阶乘(n-k));
返回res;
}
静态长阶乘(长n)
{长结果=1;
如果(n==1 | | n==0)返回1;
其他的
对于(长i=2;i我们应使用来计算

但是您可能会使用大量的
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;
    }
}
公共类FactorialUtil
{
公共静态双整数阶乘(int n)
{
biginger ret=biginger.ONE;

对于(int i=1;i在我看来,double应该可以工作,并为您提供一个很好的近似值,但是您可以使用java.math中的biginger进行任意精度的数学运算,因此您总是可以得到精确的数字。

简短而漂亮的答案(
+1
)是的,我已经检查了您的演示,它工作正常(谢谢),但您能告诉我为什么“double”数据类型返回1.2164510040832E17(20的阶乘)尽管我已按如下方式初始化变量:double result=1;而不是double=1.0;首先,您的答案是19的阶乘,请检查您的代码是否存在错误/逻辑错误,或将其张贴在此处。第二:1.2164510040832E17使用e表示法。许多计算机程序/计算器在科学e中显示非常大和非常小的结果注释。例如,aEb相当于*10^b。检查:。希望这能解决您的疑问。请接受答案,因为它有助于将来访问此问题的所有人。