【问题标题】:How to use Combinations and Factorials [closed]如何使用组合和阶乘[关闭]
【发布时间】:2020-11-17 17:31:27
【问题描述】:

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


import java.util.Scanner;

public class Factorial {

    public static void main(String[] args) {
        System.out.println("Enter Num");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        long f = 1;
        for(int i = 1; i <= num; ++i)
        {
            f *= i;
        }
        System.out.println("Factorial of " +num +" = " +f);
        System.out.println("Enter r");
        int r = sc.nextInt();
        int bracket = num-r;
        int f2 = 1;
        int rf = 1;
        for(int i = 1; i <= r; ++i)
        {
            rf *= i;
        }
        for(int i = 1; i <= bracket; ++i)
        {
            f2 *= i;
        }
        long ans = f/(rf*f2) ;
        System.out.println(num+"C"+r +" = "+ans);
    }
}

【问题讨论】:

  • 你不断重复循环乘法:使用方法。
  • 西蒙,这是一个好的开始。您会发现通过 n!/(r! (n - r)!) 计算 nCr 在大于 12 时会遇到问题,因为阶乘很快就会变成非常大的数字。另一种方法是写出阶乘并取消常用项,这将允许您处理更大的 n。还需要其他方法才能走得更远。祝你好运,玩得开心,这是个好问题。
  • 1. n!/r!n! 没有第一个 r 乘法,所以不要除以跳过它们 2。您需要使子结果尽可能小以避免整数溢出,因此您需要在单个循环中执行此操作来自a/b 的股息a,b 可被相同的值整除... 最简单的方法是测试最低有效位为零。如果它被 2 除(或右移)......如果你想要更好的测试除以几个第一个素数...... 3. 使用无符号变量,这会给你更多的比特......

标签: java math combinations formula factorial


【解决方案1】:

改进公式的一个好方法是使用递归。 你可以用这个递归方法替换你的循环:

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

【讨论】:

  • 为此使用递归并不是一个好主意,至少在 Java 中是这样。与普通的旧循环相比,它会非常慢。
  • @AndyTurner 这里没有任何效率问题,或者,就此而言,堆栈溢出有任何问题。可以用带符号的 32 位整数表示的最大阶乘是 12!。除此之外,人们必须开始考虑远远超出入门编程的替代方案。递归定义是数学公式的非常清晰的表达,因此它应该是初学者的首选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多