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
  • asp之家 软件编程 m.aspxhome.com