c# - 计算可能的组合数量 - C#

标签 c# combinations

我正在尝试计算可能组合的数量,因此我在这里使用了一些数学知识(准确地说是阶乘)。例如,如果我有 50 个数字,我想将它们分成 5 个一组,那么可以组成多少组(组合)。我正在使用这个公式:allNumbers!/(allNumbers - PerGroup)!,但对于这个特定示例,它会出现错误。它说禁止除零。我怎样才能让它发挥作用? 这是我的代码:

int b = 1;
int n = 1;

if (allNumbers - PerGroup == 0)
{
      return 1;
}
else if (allNumbers - PerGroup == 1)
{
      return allNumbers;
}
else
{
      for (int i = 1; i <= allNumbers; i++)     
      {
             b *= i;
      }

      for (int i = 1; i <= allNumbers - PerGroup; i++)
      {
             n *= i;
      }

      if (Enumerable.Range(1,int.MaxValue).Contains(b/n)) //line with ERROR!
      {
             return b/n;
      }
      else
      {
             return int.MaxValue;
      }
}

最佳答案

Enumerable.Range(1,int.MaxValue).Contains(b/n) check 不会检查值是否有效,因为 b/n 已经计算并存储为 int这次。

你会被零除,因为变量 n 溢出并变为零。在下面的代码中您可以看到溢出是如何发生的。

using System;

public class Test
{
    public static void Main()
    {
        int n = 1;
        for (int i = 1; i <= 50; i++) {
            n *= i;
            Console.WriteLine("i = {0}, n = {1}", i, n);
        }
    }
}

输出:

i = 1, n = 1
i = 2, n = 2
i = 3, n = 6
i = 4, n = 24
i = 5, n = 120
i = 6, n = 720
i = 7, n = 5040
i = 8, n = 40320
i = 9, n = 362880
i = 10, n = 3628800
i = 11, n = 39916800
i = 12, n = 479001600
i = 13, n = 1932053504
i = 14, n = 1278945280
i = 15, n = 2004310016
i = 16, n = 2004189184
i = 17, n = -288522240
i = 18, n = -898433024
i = 19, n = 109641728
i = 20, n = -2102132736
i = 21, n = -1195114496
i = 22, n = -522715136
i = 23, n = 862453760
i = 24, n = -775946240
i = 25, n = 2076180480
i = 26, n = -1853882368
i = 27, n = 1484783616
i = 28, n = -1375731712
i = 29, n = -1241513984
i = 30, n = 1409286144
i = 31, n = 738197504
i = 32, n = -2147483648
i = 33, n = -2147483648
i = 34, n = 0
i = 35, n = 0
i = 36, n = 0
i = 37, n = 0
i = 38, n = 0
i = 39, n = 0
i = 40, n = 0
i = 41, n = 0
i = 42, n = 0
i = 43, n = 0
i = 44, n = 0
i = 45, n = 0
i = 46, n = 0
i = 47, n = 0
i = 48, n = 0
i = 49, n = 0
i = 50, n = 0

关于c# - 计算可能的组合数量 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853666/

相关文章:

c# - 我如何将 gzip 用于我的 Angular 项目?

python - 查找集合列表的组合

Python - 生成符合条件的大型集合组合的最有效方法?

c# - 使用 C# 检查在远程计算机中运行的服务的状态

c# - 在 Xamarin.Forms 中使用 SqlConnection?

c# - 如何编译代码以获得每个 .Net 版本的工作代码

arrays - 用 DI 序列排列排列

linq - 另一个排列词难题…与Linq一起吗?

MySQL循环插入组合值

c# - 应用程序在 VS 中运行,但发布后失败