Java 如何使用组合和阶乘

Java 如何使用组合和阶乘,java,math,combinations,formula,factorial,Java,Math,Combinations,Formula,Factorial,我花了几分钟重新创建了公式nCr=n/R(右)!查找数组中的组合数。到目前为止,我已经成功地实现了这个公式,但我正在寻找使用这个公式的替代方法。 这是我的密码: 导入java.util.Scanner; 公共类阶乘{ 公共静态void main(字符串[]args){ System.out.println(“输入Num”); 扫描仪sc=新的扫描仪(System.in); int num=sc.nextInt(); 长f=1; 对于(inti=1;i改进公式的一个好方法是使用递归。 可以使用此

我花了几分钟重新创建了公式nCr=n/R(右)!查找数组中的组合数。到目前为止,我已经成功地实现了这个公式,但我正在寻找使用这个公式的替代方法。 这是我的密码:


导入java.util.Scanner;
公共类阶乘{
公共静态void main(字符串[]args){
System.out.println(“输入Num”);
扫描仪sc=新的扫描仪(System.in);
int num=sc.nextInt();
长f=1;

对于(inti=1;i改进公式的一个好方法是使用递归。 可以使用此递归方法替换循环:

static int factorial(int n){
    return n == 0 ? 1 : n * factorial(n-1);
}

你不断重复循环乘法:使用一个方法。西蒙,这是一个好的开始。你会发现通过n!/(r!(n-r)!)计算nCr当大于12时会遇到问题,因为阶乘很快就会变成非常大的数字。另一种方法是写出阶乘并取消常用项,这将允许您处理稍大的n。还需要其他方法来进一步。祝您好运,玩得开心,这是一个好问题。1.
n!/r!
is
n!
没有第一个
r
乘法,因此不需要除法,只需跳过它们2。您需要将子结果保持尽可能小,以避免整数溢出,因此需要在单循环中执行此操作,并且当
a/b
的两个红利
a/b
可被相同的值整除时,将它们除掉……最简单的方法是使用test最不重要的位为零。如果它被2除(或位右移)…如果您想要更好的方法,可以通过几个第一个素数来测试整除性…3.使用无符号变量,这会给您带来更多的比特数…请参阅使用递归,因为这不是一个好主意,至少在Java中是这样。与普通的旧循环相比,它会非常慢。@AndyTurner这里的效率没有任何问题,或者说,没有任何问题使用堆栈溢出。可由有符号32位整数表示的最大阶乘是12!。除此之外,还必须开始考虑远远超出介绍性编程的替代方案。递归定义是数学公式的一个非常清晰的表达式,因此,对于begi来说,它应该是首选尼尔斯。