在 C# 中生成一组数字的每个可能组合

本文关键字:数字 组合 一组 | 更新日期: 2023-09-27 18:34:56

我正在寻找一种有效的方法来生成每种可能组合的数字组合。 因此,如果我有一个整数(1 - 120(的通用列表,我希望一个结果实际上是所有120个数字,从1到120的数字顺序,然后我需要这些数字顺序不同的所有其他组合。

在 C# 中生成一组数字的每个可能组合

对于它的价值,以下是使用 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作为答案。如果它适合你刚刚找到的问题,如果不是,它只是另一个失败。

对不起,我不得不让它不认真。人们经常提出"简单"的数学问题,这些问题只是落入因式分解类型的陷阱。