在计算阶乘时,即使使用 long 和 double 我也得到垃圾值
while calculating factorial the, i am geting garbage value even using long and double
我这里贴的程序是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();
}
}
我们应该使用BigInteger to calculate 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
在我看来,double 应该可以工作并为您提供一个很好的近似值,但您可以使用 java.math[= 中的 BigInteger 14=] 用于任意精度数学,因此您总能得到精确的数字。
我这里贴的程序是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();
}
}
我们应该使用BigInteger to calculate 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
在我看来,double 应该可以工作并为您提供一个很好的近似值,但您可以使用 java.math[= 中的 BigInteger 14=] 用于任意精度数学,因此您总能得到精确的数字。