2012-12-04 43 views
1

可能重复:
Different combinations of an array (C#)使用字符串数组在C#生成组合

string[] array = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10"}; 

如何生成每组合2/3/8/10的字符串像例如2串每个组合,没有重复/重复,无视位置,使用组合公式nCr = 10!/ 2!(10-2)! = 45个组合。

我需要的输出是这样的:

"01", "02" 
"01", "03" 
"01", "04" 
... 
"02", "03" // eliminate the "02","01" 'cause it is same as "01","02" combination 
"02", "04" 
... 

然后,以产生3串的组合,将具有120个组合(根据NCR)。 我需要的输出是这样的:4串

"01","02","03" 
"01","02","04" 
... 

和组合,将具有210个组合,至少,每组合5串的组合,将具有252种组合。

我该怎么写呢?我已经用完了很多循环,看起来真的很乱。

+0

我不明白一切,但它可以帮助你吗?使用两个数字获得ncr Combinaison的功能:http://www.programmingsimplified.com/c/source-code/c-program-find-ncr-and-npr或者:http://www.dreamincode.net/code /snippet2334.htm –

+0

我需要的组合,不是总的组合 –

+0

@TheMouthofaCow类似,但不一样。 – Rawling

回答

8

你可以使用一个简单的递归:

private static IEnumerable<string> Combinations(int start, int level) 
{ 
    for (int i = start; i < array.Length; i++) 
    if (level == 1) 
     yield return array[i]; 
    else 
     foreach (string combination in Combinations(i + 1, level - 1)) 
     yield return String.Format("{0} {1}", array[i], combination); 
} 

的称呼它:

var combinations = Combinations(0, 2); 

    foreach (var item in combinations) 
    Console.WriteLine(item); 
+0

这已经救了我,谢谢:) –

+1

这是一个天才的解决方案。 – Barun

6

您可以使用这个高效的项目:Permutations, Combinations, and Variations using C# Generics

string[] array = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10" }; 
int lowerIndex = 2; 
var combinations = new Facet.Combinatorics.Combinations<String>(
    array, 
    lowerIndex, 
    Facet.Combinatorics.GenerateOption.WithoutRepetition 
); 

foreach (IList<String> combis in combinations) 
{ 
    String combi = String.Join(" ", combis); 
    Console.WriteLine(combi); 
} 

因为它是开源的,你可以看看它是如何实现的。但上面的链接也非常丰富。

输出(lowerIndex = 2):

01 02 
01 03 
01 04 
01 05 
01 06 
01 07 
01 08 
01 09 
01 10 
02 03 <-- no 02 01 since it would be a repitition 
02 04 
02 05 
// ... (45 combinations w/o repetitions) 
09 10 

输出(lowerIndex = 5):

01 02 03 04 05 
01 02 03 04 06 
01 02 03 04 07 
01 02 03 04 08 
01 02 03 04 09 
01 02 03 04 10 
01 02 03 05 06 
01 02 03 05 07 
01 02 03 05 08 
01 02 03 05 09 
01 02 03 05 10 
01 02 03 06 07 
// ........... (252 combinations w/o repetitions) 
05 07 08 09 10 
06 07 08 09 10 
+0

如何在代码中使用“Facet”?需要一个特定的命名空间/库? –

+0

当然可以。我提供的[** link **](http://www.codeproject.com/Articles/26050/Permutations-Combinations-and-Variations-using-C-G)还包含两个下载链接(位于顶部)。一个用于演示程序,另一个用于源代码。 –

-1

这里是执行使用nCr的两个数的组合的功能,调整它为多个号码

/// <summary> 
    /// Performs a nCr Combination of the two numbers 
    /// </summary> 
    /// <param name="n">The Number</param> 
    /// <param name="r">The Range</param> 
    /// <returns></returns> 
    public static double Combination(double n, double r) 
    { 
     /* 
     * Formula for Combination: n!/(r! * (n - r)!) 
     */ 

     // n and r should be integral values 
     double rfloor = Math.Floor(r); 
     double nfloor = Math.Floor(n); 
     // Check for all invalid values of n and r. 
     if ((n < 1) || (r < 0) || (r > n) || (r != rfloor) || (n != nfloor)) 
     { 
      throw new Exception("Invalid Input to Combination Function: Number must be greater than Range"); 
     } 

     return Factorial(n)/(Factorial(r) * Factorial(n - r)); 
    } 

而且

public static double Factorial(double n) 
    { 
     if (n < 0) { throw new Exception("Cannot take the factorial of a negative number"); } 
     double factorial = 1; 
     // 0! and 1! = 1 
     for (double i = 2; i < n + 1; i++) 
     { 
      factorial *= i; 
     } 
     return factorial; 
    }