亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實(shí)現(xiàn)排列組合算法完整實(shí)例

 更新時(shí)間:2014年09月02日 09:45:28   投稿:shichen2014  
這篇文章主要介紹了C#實(shí)現(xiàn)排列組合算法的完整實(shí)例,文中實(shí)例主要展示了排列循環(huán)方法和排列堆棧方法,需要的朋友可以參考下

排列組合是常見的數(shù)學(xué)問題,本文就以完整實(shí)例形式講述了C#實(shí)現(xiàn)排列組合算法的方法。分享給大家供大家參考之用。具體方法如下:

首先,數(shù)學(xué)中排列組合,可表示為:排列P(N,R)

其實(shí)排列實(shí)現(xiàn)了,組合也就實(shí)現(xiàn)了,組合C(N,R)就是P(N,R)/P(R,R) ,實(shí)現(xiàn)這一功能比較簡單的是遞歸算法,但考慮到遞歸的性能,下面采用了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>  
    /// 排列循環(huán)方法  
    /// </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#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C#執(zhí)行表達(dá)式樹(Expression Tree)的具體使用

    C#執(zhí)行表達(dá)式樹(Expression Tree)的具體使用

    本文將深入探討表達(dá)式樹的基本概念、創(chuàng)建方法、修改和刪除節(jié)點(diǎn)、查詢和遍歷技巧以及在C#中的應(yīng)用示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • C# 禁止應(yīng)用程序多次啟動(dòng)的實(shí)例

    C# 禁止應(yīng)用程序多次啟動(dòng)的實(shí)例

    經(jīng)常我們會(huì)有這樣的需求,只讓應(yīng)用程序運(yùn)行一個(gè)實(shí)體,下面是實(shí)現(xiàn)的方法,有需要的朋友可以參考一下
    2013-09-09
  • 最新評論