C#實(shí)現(xiàn)排列組合算法完整實(shí)例
排列組合是常見(jiàn)的數(shù)學(xué)問(wèn)題,本文就以完整實(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)這一功能比較簡(jiǎ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);
}
}
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- C#生成指定范圍內(nèi)的不重復(fù)隨機(jī)數(shù)
- C#生成不重復(fù)隨機(jī)字符串類(lèi)
- C#生成唯一不重復(fù)訂單號(hào)
- C#隨機(jī)生成不重復(fù)字符串的兩個(gè)不錯(cuò)方法
- C#不重復(fù)輸出一個(gè)數(shù)組中所有元素的方法
- C#實(shí)現(xiàn)在購(gòu)物車(chē)系統(tǒng)中生成不重復(fù)訂單號(hào)的方法
- c# 兩個(gè)數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實(shí)現(xiàn)
- C#中實(shí)現(xiàn)任意List的全組合算法代碼
- C#查找字符串所有排列組合的方法
- C#實(shí)現(xiàn)組合排列的方法
- 詳解C#的排列組合
- C#實(shí)現(xiàn)生成所有不重復(fù)的組合功能示例
相關(guān)文章
通過(guò)C#編寫(xiě)一個(gè)簡(jiǎn)易的Windows截屏增強(qiáng)工具
在使用?Windows?系統(tǒng)的截屏快捷鍵?PrintScreen?截屏?xí)r,如果需要把截屏保存到文件,需要先粘貼到畫(huà)圖工具然后另存為文件。所以本文用C#編寫(xiě)了一個(gè)簡(jiǎn)易的Windows截屏增強(qiáng)工具,需要的可以參考一下2022-05-05
C#實(shí)現(xiàn)身份證號(hào)碼驗(yàn)證的方法
這篇文章主要介紹了C#實(shí)現(xiàn)身份證號(hào)碼驗(yàn)證的方法,通過(guò)封裝的類(lèi)文件實(shí)例化調(diào)用實(shí)現(xiàn)了對(duì)身份證號(hào)碼的驗(yàn)證,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11
C#中神器類(lèi)BlockingCollection的實(shí)現(xiàn)詳解
如果你想玩轉(zhuǎn)C#?里面多線(xiàn)程,工廠模式,生產(chǎn)者/消費(fèi)者,隊(duì)列等高級(jí)操作,就可以和我一起探索這個(gè)強(qiáng)大的線(xiàn)程安全提供阻塞和限制功能的C#神器類(lèi)BlockingCollection吧2023-02-02
WPF中實(shí)現(xiàn)彈出進(jìn)度條窗口的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何WPF中實(shí)現(xiàn)彈出進(jìn)度條窗口,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
C#使用對(duì)象序列化類(lèi)庫(kù)MessasgePack
這篇文章介紹了C#使用對(duì)象序列化類(lèi)庫(kù)MessasgePack的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

