C#实现排列组合算法完整实例
作者:shichen2014 时间:2023-04-16 09:36:59
排列组合是常见的数学问题,本文就以完整实例形式讲述了C#实现排列组合算法的方法。分享给大家供大家参考之用。具体方法如下:
首先,数学中排列组合,可表示为:排列P(N,R)
其实排列实现了,组合也就实现了,组合C(N,R)就是P(N,R)/P(R,R) ,实现这一功能比较简单的是递归算法,但考虑到递归的性能,下面采用了2种非递归的方法,具体代码如下
using System;
using System.Collections.Generic;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(P1(6, 3));
Console.WriteLine(P2(6, 3));
Console.WriteLine(C(6, 2));
}
/// <summary>
/// 排列循环方法
/// </summary>
/// <param name="N"></param>
/// <param name="R"></param>
/// <returns></returns>
static long P1(int N, int R)
{
if (R > N || R <= 0 || N <= 0 ) throw new ArgumentException("params invalid!");
long t = 1;
int i = N;
while (i!=N-R)
{
try
{
checked
{
t *= i;
}
}
catch
{
throw new OverflowException("overflow happens!");
}
--i;
}
return t;
}
/// <summary>
/// 排列堆栈方法
/// </summary>
/// <param name="N"></param>
/// <param name="R"></param>
/// <returns></returns>
static long P2(int N, int R)
{
if (R > N || R <= 0 || N <= 0 ) throw new ArgumentException("arguments invalid!");
Stack<int> s = new Stack<int>();
long iRlt = 1;
int t;
s.Push(N);
while ((t = s.Peek()) != N - R)
{
try
{
checked
{
iRlt *= t;
}
}
catch
{
throw new OverflowException("overflow happens!");
}
s.Pop();
s.Push(t - 1);
}
return iRlt;
}
/// <summary>
/// 组合
/// </summary>
/// <param name="N"></param>
/// <param name="R"></param>
/// <returns></returns>
static long C(int N, int R)
{
return P1(N, R) / P1(R, R);
}
}
}
希望本文所述对大家的C#程序设计有所帮助。
标签:C#,排列,组合,算法
0
投稿
猜你喜欢
RecyclerView实现纵向和横向滚动
2023-04-03 14:50:44
java中申请不定长度数组ArrayList的方法
2023-02-24 17:37:37
基于C#实现微信支付宝扫码支付功能
2023-09-24 04:53:49
Android中ImageCropper矩形、圆形 裁剪框的实现方法
2022-04-17 02:41:28
listView的item中有checkbox,导致setOnItemClick失效的原因及解决办法
2022-09-04 10:57:12
MyBatis实践之DAO与Mapper
2022-09-28 23:19:32
Java应用层协议WebSocket实现消息推送
2022-05-09 07:26:29
Java中实现双数组Trie树实例
2023-03-19 15:12:38
C#读取写入文件的3种方式示例代码
2022-09-15 06:57:38
android 多点触摸图片缩放的具体实现方法
2023-03-14 05:49:31
Java实现读写文件功能的代码分享
2023-02-07 04:07:02
详解Spring boot上配置与使用mybatis plus
2023-02-27 08:53:11
Java服务器主机信息监控工具类的示例代码
2023-07-26 04:34:49
Springboot 整合shiro实现权限控制的方法
2021-09-21 20:15:47
解决使用json-lib包实现xml转json时空值被转为空中括号的问题
2022-10-20 02:12:14
C#实现自定义打印文字和图片的示例代码
2021-05-30 02:35:20
Android WindowManger的层级分析详解
2023-08-05 23:51:40
详解JAVA之运算符
2023-09-05 13:22:46
Android应用内悬浮窗Activity的简单实现
2023-07-28 04:03:00
深入浅析C#泛型类型
2023-01-30 06:45:54