码迷,mamicode.com
首页 > 编程语言 > 详细

C#实现排列组合算法完整实例

时间:2017-11-13 23:18:00      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:over   push   常见   c#   []   ati   space   ret   name   

排列组合是常见的数学问题,本文就以完整实例形式讲述了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#实现排列组合算法完整实例

标签:over   push   常见   c#   []   ati   space   ret   name   

原文地址:http://www.cnblogs.com/paobuke/p/7828250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!