C#實現(xiàn)排列組合算法完整實例
更新時間:2014年09月02日 09:45:28 投稿:shichen2014
這篇文章主要介紹了C#實現(xiàn)排列組合算法的完整實例,文中實例主要展示了排列循環(huán)方法和排列堆棧方法,需要的朋友可以參考下
排列組合是常見的數(shù)學(xué)問題,本文就以完整實例形式講述了C#實現(xiàn)排列組合算法的方法。分享給大家供大家參考之用。具體方法如下:
首先,數(shù)學(xué)中排列組合,可表示為:排列P(N,R)
其實排列實現(xiàn)了,組合也就實現(xiàn)了,組合C(N,R)就是P(N,R)/P(R,R) ,實現(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è)計有所幫助。
您可能感興趣的文章:
- C#生成指定范圍內(nèi)的不重復(fù)隨機(jī)數(shù)
- C#生成不重復(fù)隨機(jī)字符串類
- C#生成唯一不重復(fù)訂單號
- C#隨機(jī)生成不重復(fù)字符串的兩個不錯方法
- C#不重復(fù)輸出一個數(shù)組中所有元素的方法
- C#實現(xiàn)在購物車系統(tǒng)中生成不重復(fù)訂單號的方法
- c# 兩個數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實現(xiàn)
- C#中實現(xiàn)任意List的全組合算法代碼
- C#查找字符串所有排列組合的方法
- C#實現(xiàn)組合排列的方法
- 詳解C#的排列組合
- C#實現(xiàn)生成所有不重復(fù)的組合功能示例
相關(guān)文章
通過C#編寫一個簡易的Windows截屏增強(qiáng)工具
在使用?Windows?系統(tǒng)的截屏快捷鍵?PrintScreen?截屏?xí)r,如果需要把截屏保存到文件,需要先粘貼到畫圖工具然后另存為文件。所以本文用C#編寫了一個簡易的Windows截屏增強(qiáng)工具,需要的可以參考一下2022-05-05
C#中神器類BlockingCollection的實現(xiàn)詳解
如果你想玩轉(zhuǎn)C#?里面多線程,工廠模式,生產(chǎn)者/消費(fèi)者,隊列等高級操作,就可以和我一起探索這個強(qiáng)大的線程安全提供阻塞和限制功能的C#神器類BlockingCollection吧2023-02-02

