两种方法计算组合数C#程序
2010-02-01 12:25
260 查看
/// <summary>
/// 快速计算组合数
/// </summary>
/// <param name="n"></param>
/// <param name="m"></param>
/// <returns></returns>
private UInt64 calcCombinQuick(int n, int m)
{
if(m==n) return 1;
if (n == 0) return 1;
if (n == 1) return (UInt64)m;
int[] sn = new int
;
int[] tn = new int
;
UInt64 times=1;
int temp = 1;
for (int i = 0; i < n; i++)
{
sn[i] = m - i;
tn[i] = i + 1;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
temp=calcGreatestCommonDivisor(sn[i],tn[j]);
if (temp > 1)
{
sn[i] = sn[i] / temp;
tn[j] = tn[j] / temp;
}
}
times *= (UInt64)sn[i];
}
return times;
}
/// <summary>
/// 计算最大公约数
/// </summary>
/// <param name="v"></param>
/// <param name="u"></param>
/// <returns>最大公约数</returns>
private int calcGreatestCommonDivisor(int v, int u)
{
int t = 1;
int r;
if (v > u)
{ t = u; u = v; v = t; }
while ((r = u % v) != 0)
{
u = v;
v = r;
}
return (v);
}
/// <summary>
/// 递归法计算组合数,不过很慢的
/// </summary>
/// <param name="mm"></param>
/// <param name="nn"></param>
/// <returns></returns>
private UInt64 calccombin(int mm, int nn)
{
if (( nn == 0)||(mm==nn)) return 1;
return calccombin(mm - 1, nn - 1) + calccombin(mm-1, nn);
}
/// 快速计算组合数
/// </summary>
/// <param name="n"></param>
/// <param name="m"></param>
/// <returns></returns>
private UInt64 calcCombinQuick(int n, int m)
{
if(m==n) return 1;
if (n == 0) return 1;
if (n == 1) return (UInt64)m;
int[] sn = new int
;
int[] tn = new int
;
UInt64 times=1;
int temp = 1;
for (int i = 0; i < n; i++)
{
sn[i] = m - i;
tn[i] = i + 1;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
temp=calcGreatestCommonDivisor(sn[i],tn[j]);
if (temp > 1)
{
sn[i] = sn[i] / temp;
tn[j] = tn[j] / temp;
}
}
times *= (UInt64)sn[i];
}
return times;
}
/// <summary>
/// 计算最大公约数
/// </summary>
/// <param name="v"></param>
/// <param name="u"></param>
/// <returns>最大公约数</returns>
private int calcGreatestCommonDivisor(int v, int u)
{
int t = 1;
int r;
if (v > u)
{ t = u; u = v; v = t; }
while ((r = u % v) != 0)
{
u = v;
v = r;
}
return (v);
}
/// <summary>
/// 递归法计算组合数,不过很慢的
/// </summary>
/// <param name="mm"></param>
/// <param name="nn"></param>
/// <returns></returns>
private UInt64 calccombin(int mm, int nn)
{
if (( nn == 0)||(mm==nn)) return 1;
return calccombin(mm - 1, nn - 1) + calccombin(mm-1, nn);
}
相关文章推荐
- 计算程序运行时间的两种方法
- Linux下计算程序运行时间的两种方法
- Linux下计算程序运行时间的两种方法 //代码转载
- Linux下计算程序运行时间的两种方法
- Linux下计算程序运行时间的两种方法
- 组合数计算的两种方法
- Linux下计算程序运行时间的两种方法(转载)
- 两种方法分析每月工作日计算程序
- Linux下计算程序运行时间的两种方法
- Matlab中计算程序运行时间的三种方法
- 时序裕量计算之三:两种计算方法的比较
- 在GUI程序中使用控制台的两种方法-方法2
- 90页第三题,创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 ,编程利用Rectangle输出一个矩形的
- Android 实现按两次返回键退出程序(两种方法)
- HR人力资源软件考勤的两种计算方法
- 组合c(m,n)的计算方法
- 计算斐波那契数列,两种方法,打开注释掉的语句你会感受到算法的力量
- 去除zencart程序的zenid参数的两种方法
- 程序开发: Oracle各种日期计算方法(收藏)
- C/C++ 计算时间差的五种方法 / Qt 计算时间差的两种方法