1. 程式人生 > >C#實現排列組合算法完整實例

C#實現排列組合算法完整實例

sts parent ons collect edi thumb img reader 組合

排列組合是常見的數學問題,本文就以完整實例形式講述了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#實現排列組合算法完整實例

本文地址: http://www.paobuke.com/develop/c-develop/pbk23563.html






相關內容

技術分享C#多線程之線程控制詳解技術分享C#連接mysql的方法【基於vs2010】技術分享C#使用LitJson解析JSON的示例代碼技術分享詳細解析C#多線程同步事件及等待句柄
技術分享C#如何遍歷Dictionary技術分享C#通過oledb訪問access數據庫的方法技術分享C#使用StreamReader讀取文件的方法技術分享C#中使用ADOMD.NET查詢多維數據集的實現方法

C#實現排列組合算法完整實例