在 C# 中生成一组数字的每个可能组合
本文关键字:数字 组合 一组 | 更新日期: 2023-09-27 18:34:56
我正在寻找一种有效的方法来生成每种可能组合的数字组合。 因此,如果我有一个整数(1 - 120(的通用列表,我希望一个结果实际上是所有120个数字,从1到120的数字顺序,然后我需要这些数字顺序不同的所有其他组合。
对于它的价值,以下是使用 LINQ 和递归对小范围(例如 1-8(完成此操作的方法。
如果您尝试以增量方式增加范围,您将意识到为什么这种方法不起作用。
static void Main(string[] args)
{
int[][] combinations = GetCombinations(8).Select(c => c.ToArray()).ToArray();
string s = string.Join("'n", combinations.Select(c => string.Join(",", c)));
Console.WriteLine(s);
}
static IEnumerable<IEnumerable<int>> GetCombinations(int count)
{
return GetCombinations(Enumerable.Range(1, count));
}
static IEnumerable<IEnumerable<int>> GetCombinations(IEnumerable<int> elements)
{
if (elements.Count() == 1)
return EnumerableSingle(elements);
return elements.SelectMany((element, index) =>
GetCombinations(elements.ExceptAt(index)).Select(tail =>
tail.Prepend(element)));
}
static IEnumerable<T> ExceptAt<T>(this IEnumerable<T> source, int index)
{
return source.Take(index).Concat(source.Skip(index + 1));
}
static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T element)
{
return EnumerableSingle(element).Concat(source);
}
static IEnumerable<T> EnumerableSingle<T>(T element)
{
return Enumerable.Repeat(element, 1);
}
好吧,当你找到一种方法来快速做到这一点时,去领取诺贝尔奖。
您刚刚打破了基于类似原语的所有现代加密机制 - 事实上,计算两个(素数(nubmers的每个可能组合是不可能的。
如果这是家庭作业,你就开玩笑了。 如果你真的认为有一个神奇的隐藏秘密,我们不会告诉你,你是——生活在妄想中。
抱歉,这是毫无意义的问题之一。
我正在寻找一种有效的方法
定义高效。我现在能看到的最有效的方法是抓住一吨计算机并用蛮力去做。据称,国家安全局现在可以在可接受的时间范围内为128个数字做到这一点;)
如果你的钱有限,那么另一种选择就是争取时间。在某个地方放一台带有太阳能电池板的小机器,让它计算一段时间。据说根据世界上一个真实的故事(如"银河系的徒步旅行者指南"中所述(,这就是地球存在的原因 - 向绝对答案者计算问题,即 42。
第三种方式 - 迄今为止最有效的 - 只是使用42作为答案。如果它适合你刚刚找到的问题,如果不是,它只是另一个失败。
对不起,我不得不让它不认真。人们经常提出"简单"的数学问题,这些问题只是落入因式分解类型的陷阱。