如何在C#中执行组合任务

时间:2014-07-29 10:03:28

标签: c# math calculator combinatorics

我遇到组合任务的问题。我想有一个代码可以处理这个数学计算48/5 = 1712304(5!= 5 * 4 * 3 * 2 * 1 = 120 48 * 47 * 46 * 45 * 44 = 205476480 205476480/120 = 1712304)< / p>

这里有一些更多细节。 我有一个包含48个字符串的字符串数组。字符串的长度在2到3个字符之间。

string array[] = new string[]{"A1","1D","410" /*[....]*/}

我想将5个字符串组合在一起,我想用整个数组做这个,我最大的问题是组合字符串只允许包含48个字符串中的每一个。每个组合的字符串必须是唯一的。

最后我需要一个包含1712304字符串条目的List,其长度必须介于10到15之间。例如,一个字符串可能看起来像“A11A4103E1T”。

回到数学,我知道有1712304组合选项,所以任何其他结果一定是错的。这就是我出现问题的地方。

我创建了以下代码而没有成功的结果

        string[] siDigit = new string[iNumDigits];
        List<string> liste = new List<string>();
        const int iDigitBase = 48;
        const int iNumDigits = 5;

        for (int i = 0; i < 1712303; ++i)
        {
            int i2 = i;
            for (int i3 = 0; i3 < iNumDigits; ++i3)
            {
                siDigit[i3] = array[i2 % iDigitBase];
                i2 /= iDigitBase;
            }
            bool duplicate_free = siDigit.Distinct().Count() == siDigit.Length;
            if (duplicate_free == true)
            {
                liste.Add(siDigit[0] + siDigit[1] + siDigit[2] + siDigit[3] + siDigit[4]);
                Console.Write(siDigit[0] + siDigit[1] + siDigit[2] + siDigit[3] + siDigit[4]);
                Console.WriteLine();
            }
        }

我得到的是在我的列表中减少条目的方式,我只获得1317051条目并且不知道为什么。我无法找到解决问题的方法,也许有人可以帮助我。

非常感谢任何帮助。

P.S在德国,他们不会教更好的英语:)

1 个答案:

答案 0 :(得分:0)

我认为你的算法错了。

考虑i等于0,i2等于0,所以siDigit [i3](i3 = 0,1,2,3,4)是数组[0],duplicate_free是假。你输了一个。所以,你无法获得所有参赛作品。

这是一个递归算法:

private static void GetCombination(ref List<string[]> list, string[] t, int n, int m, int[] b, int M)
{
    for (int i = n; i >= m; i--)
    {
        b[m - 1] = i - 1;
        if (m > 1)
        {
            GetCombination(ref list, t, i - 1, m - 1, b, M);
        }
        else
        {
            if (list == null)
            {
                list = new List<string[]>();
            }
            string[] temp = new string[M];
            for (int j = 0; j < b.Length; j++)
            {
                temp[j] = t[b[j]];
            }
            list.Add(temp);
        }
    }
}

public static List<string[]> GetCombination(string[] t, int n)
{
    if (t.Length < n)
    {
        return null;
    }
    int[] temp = new int[n];
    List<string[]> list = new List<string[]>();
    GetCombination(ref list, t, t.Length, n, temp, n);
    return list;
}