Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中生成一组数字的所有可能组合#_C#_Math_Grouping_Permutation_Combinations - Fatal编程技术网

C# 在C语言中生成一组数字的所有可能组合#

C# 在C语言中生成一组数字的所有可能组合#,c#,math,grouping,permutation,combinations,C#,Math,Grouping,Permutation,Combinations,我正在寻找一种有效的方法,在每种可能的组合中生成一个数字组合。所以,如果我有一个整数(1-120)的通用列表,我希望一个结果实际上是所有120个数字的数字顺序,从1到120,然后我需要这些数字顺序不同的每一个组合。好吧,当你找到一种快速的方法时,去申请诺贝尔奖 你刚刚打破了每一个现代加密机制,它基于一个相似的原理——计算两个(素数)numer的每一个可能的组合不可能很快 如果那是一个家庭作业,你就会开玩笑。如果你真的认为我们没有告诉你一个神奇的秘密,那你就是生活在错觉中 对不起,这是一个毫无意义

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

好吧,当你找到一种快速的方法时,去申请诺贝尔奖

你刚刚打破了每一个现代加密机制,它基于一个相似的原理——计算两个(素数)numer的每一个可能的组合不可能很快

如果那是一个家庭作业,你就会开玩笑。如果你真的认为我们没有告诉你一个神奇的秘密,那你就是生活在错觉中

对不起,这是一个毫无意义的问题

我在寻找一种有效的方法

定义有效。我现在能看到的最有效的方法就是抓起一吨台电脑,然后用蛮力去做。据推测,国家安全局现在可以在可接受的时间范围内为128个号码做到这一点;)

如果你的钱有限,另一个选择就是争取时间。把一台装有太阳能电池板的小机器放在某处,让它计算一段时间。据推测,根据一个真实的世界故事(如《银河系希希希克斯指南》中所述),这就是地球存在的原因——计算问题的绝对答案是42

第三种方法——目前为止最有效的方法——就是用42作为答案。如果它合适,你就找到了问题,如果不合适,那就是另一个失败


对不起,我不得不把它说得不严肃。人们经常会问一些“简单”的数学问题,而这些问题只是落入了因式分解的陷阱。

好吧,当你找到一种快速解决问题的方法时,就去申请诺贝尔奖吧

你刚刚打破了每一个现代加密机制,它基于一个相似的原理——计算两个(素数)numer的每一个可能的组合不可能很快

如果这是一个家庭作业,你就会开玩笑。如果你真的认为我们没有告诉你一个神奇的秘密,你就是生活在错觉中

对不起,这是一个毫无意义的问题

我在寻找一种有效的方法

定义有效。我现在看到的最有效的方法是抓取一吨台计算机并用蛮力进行攻击。国家安全局应该可以在可接受的时间范围内对128个数字进行攻击;)

如果你的钱有限,另一种选择就是花时间。把一台装有太阳能电池板的小型机器放在某处,让它计算一段时间。据推测,根据一个真实的世界故事(如《银河系希希克斯指南》所述),这就是地球存在的原因——向绝对答案者计算这个问题,也就是42

第三种方法——到目前为止最有效的方法——就是用42作为答案。如果它适合你,你只是找到了问题,如果不适合,那只是又一次失败


对不起,我必须把它说得不严重。人们经常会遇到“简单”的数学问题,而这些问题恰恰落入了因式分解类型的陷阱。

关于它的价值,这里介绍了如何使用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);
}
static void Main(字符串[]args)
{
int[][]combines=getcombines(8)。选择(c=>c.ToArray()).ToArray();
字符串s=string.Join(“\n”,组合。选择(c=>string.Join(“,”,c));
控制台。写入线(s);
}
静态IEnumerable GetCompositions(整数计数)
{
返回GetCombinations(可枚举的范围(1,count));
}
静态IEnumerable GetCompositions(IEnumerable元素)
{
if(elements.Count()==1)
返回可枚举的单个(元素);
返回元素。选择多个((元素,索引)=>
GetCombinations(elements.ExceptAt(index)).Select(tail=>
尾部。前置(元素));
}
静态IEnumerable例外(此IEnumerable源,int索引)
{
返回source.Take(index).Concat(source.Skip(index+1));
}
静态IEnumerable前置端(此IEnumerable源,T元素)
{
返回EnumerableSingle(元素).Concat(源);
}
静态IEnumerable可枚举单元素(T元素)
{
返回可枚举。重复(元素,1);
}

关于它的价值,下面介绍如何使用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);
}
static void Main(字符串[]args)
{
int[][]combines=getcombines(8)。选择(c=>c.ToArray()).ToArray();
字符串s=string.Join(“\n”,组合。选择(c=>string.Join(“,”,c));
控制台。写入线(s);
}
静态IEnumerable GetCompositions(整数计数)
{
返回GetCombinations(可枚举的范围(1,count));
}
静态IEnumerable GetCompositions(IEnumerable元素)
{
if(elements.Count()==1)
返回可枚举的单个(元素);
返回元素。选择多个((元素,索引)=>
GetCombinations(elements.ExceptAt(index)).Select(tail=>
尾部。前置(元素));
}
静态IEnumerable例外(此IEnumerable源,int索引)
{
返回source.Take(index).Concat(source.Skip(index+1));
}
静态IEnumerable前置端(此IEnumerable源,T元素)
{
返回EnumerableSingle(元素).Concat(源);
}
静态IEnumerable可枚举单元素(T元素)
{
返回可枚举。重复(元素,1);
}

您是否发现或开发了一种效率不足以满足您需求的方法?并需要帮助完善它(所以可能应该张贴)-或者这只是一个“请发送代码”的恳求?你知道有120!不同的组合,对吗?以每纳秒100万次的排列速度,仍然需要1.2e178年。@helloworld922:最好尽快开始