【发布时间】:2014-07-29 10:03:28
【问题描述】:
我有一个组合任务的问题。我想要一个可以处理这个数学计算的代码 48/5 = 1712304 (5! = 5*4*3*2*1 = 120 48*47*46*45*44 = 205476480 205476480/120 = 1712304)
这里有更多细节。 我有一个包含 48 个字符串的字符串数组。字符串的长度在 2 到 3 个字符之间。
string array[] = new string[]{"A1","1D","410" /*[....]*/}
我想将 5 个字符串组合在一起,并且我想对整个数组执行此操作,我最大的问题是一个组合字符串只允许包含 48 个字符串中的每个字符串一次。并且每个组合字符串必须是唯一的。
最后我需要一个包含 1712304 个字符串条目的列表,其长度必须在 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 在德国他们不教更好的英语:)
【问题讨论】:
-
是否有没有包含在 sn-p 中的外部循环?如果没有,我看不出列表中怎么可能有超过 1712304 个项目。
-
如果这不是需要您自己编写算法内容的作业,请使用像this one 这样的第三方库。请注意,您可能无法将结果一次全部存储在内存中。我链接的库为您提供了一个 IEnumerable,您可以一一列举。
-
好吧,我编辑了我的帖子,我很困惑,以至于我没有意识到我对我的旧代码写了评论,很抱歉这个错误。因为我不再上学了,所以没有作业;)
-
除非我错过了什么不只是
string.Join(array.Distinct())? -
我猜你错过了什么。因为我不想从现有数组或类似的东西中删除重复项。问题是我无法正确创建我的条目
标签: c# math calculator combinatorics