C#遍历输出从n个数中选择m个数的不重复取数的所有组合

2024-03-19 09:20

本文主要是介绍C#遍历输出从n个数中选择m个数的不重复取数的所有组合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.不重复取数的C(n,m)组合数

2.编程实现C(5, 3)不重复取数的组合并遍历输出


1.不重复取数的C(n,m)组合数

        从集合中选择不重复元素的组合数可以用数学公式表示为:

C(n, m) = n! / (m!(n - m)!)
其中:
n! 表示 n 的阶乘,即 n × (n-1) × (n-2) × … × 3 × 2 × 1
m! 表示 m 的阶乘,即 m × (m-1) × (m-2) × … × 3 × 2 × 1
(n - m)! 表示 (n - m) 的阶乘,即 (n - m) × (n - m - 1) × (n - m - 2) × … × 3 × 2 × 1

        C(n, m) 表示从 n 个不同的元素中选择 m 个元素的组合数。在这个公式中,我们通过计算所有可能的排列并去除重复的排列来得到不重复的组合数。

2.编程实现C(5, 3)不重复取数的组合并遍历输出

        这个程序与作者的的可重复取数组合的程序类似,主要区别在于GenerateCombinations方法中的递归调用。在这个版本中,检查每个生成的组合是否包含当前的索引值。如果组合中不包含当前索引值,我们将其添加到结果中。这样,我们就可以确保生成的所有组合中的数字都是不重复的。

// 从n个数中选择m个数的不重复取数的所有组合namespace _152_2
{class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);int n = 5; // 不重复的数的数量int m = 3; // 需要选择的不重复数的数量var combinations = GenerateCombinations(n, m).ToList();Console.WriteLine("从n={0}个不重复的数中选择m={1}个不重复数的组合数为:{2}", n, m, combinations.Count);Console.WriteLine("所有可能的组合:");foreach (var combination in combinations){Console.WriteLine(string.Join(", ", combination));}}static IEnumerable<IEnumerable<int>> GenerateCombinations(int n, int m){if (m == 0){yield return Enumerable.Empty<int>();}else{for (int i = 0; i < n; i++){foreach (var combination in GenerateCombinations(n, m - 1)){if (!combination.Contains(i)){yield return combination.Concat([i]);}}}}}}
}
//运行结果:
/*
从n=5个不重复的数中选择m=3个不重复数的组合数为:60
所有可能的组合:
2, 1, 0
3, 1, 0
4, 1, 0
1, 2, 0
3, 2, 0
4, 2, 0
1, 3, 0
2, 3, 0
4, 3, 0
1, 4, 0
2, 4, 0
3, 4, 0
2, 0, 1
3, 0, 1
4, 0, 1
0, 2, 1
3, 2, 1
4, 2, 1
0, 3, 1
2, 3, 1
4, 3, 1
0, 4, 1
2, 4, 1
3, 4, 1
1, 0, 2
3, 0, 2
4, 0, 2
0, 1, 2
3, 1, 2
4, 1, 2
0, 3, 2
1, 3, 2
4, 3, 2
0, 4, 2
1, 4, 2
3, 4, 2
1, 0, 3
2, 0, 3
4, 0, 3
0, 1, 3
2, 1, 3
4, 1, 3
0, 2, 3
1, 2, 3
4, 2, 3
0, 4, 3
1, 4, 3
2, 4, 3
1, 0, 4
2, 0, 4
3, 0, 4
0, 1, 4
2, 1, 4
3, 1, 4
0, 2, 4
1, 2, 4
3, 2, 4
0, 3, 4
1, 3, 4
2, 3, 4*/

这篇关于C#遍历输出从n个数中选择m个数的不重复取数的所有组合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/825505

相关文章

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文