c语言组合数算法不用递归怎么做

c语言组合数算法不用递归怎么做,第1张

不用递归则可以用 公式的呀,从n个元素中选取m个(n>=m)的组合数,公式如下。

C(n, m) = n!/(m! * (n-m)!)

而m!和(n-m)!两者中的较大一个可以和n!的前若干项约分掉,我们不妨设n-m >m,笑核饥则(n-m)!可以被碰返约掉,只要求m!和 (n-m+1)*...*n即可。然后将这两个连乘积相除,即为组合数。

程序可如下:

#include <stdio.h>

void main( )

{

int n, m, max, min, i, s = 1, r = 1

scanf("%d%d", &n, &m)

max = (m >(n-m) ? m : (n - m))

min = n - max

for(i = 1i <= mini++)

r *= i,  s *= (max + i)

printf("C(%d,%d) = %d\n", n, m, s / r)  /*max的阶乘可以约掉,所以不必求氏凯*/

}

运行结果:

#include "stdafx.h"

#include <stack>

#include <iostream>

using namespace std

const int N = 3 //数组个数

const int M =4//每个数组元素

int a[N][M] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}}

int Sta[N]={0}

bool IsStaHasZero()

{

for(int i =0i<Ni++)

{

if(Sta[i]==0)

{

return true

}

}

return false

}

void AdjustSta()

{

//Sta中不应该有0,如果有,那么进行调樱困整

while(IsStaHasZero())

{

for(int i=N-1i>0i--)

{

if(Sta[i] ==0)

{

Sta[i-1] = Sta[i-1]-1

//j到N都重置为M

for(int j =ij<Nj++)

{

Sta[j] =M

}

}

}

}

}

int Count =1

int _tmain(int argc, _TCHAR* argv[])

{

//初始化

for(int i =0i<Ni++)

{

Sta[i]=M

}

//第一个问题,肯定是首颂橡M^N种组合,直接for循环遍历即可

while(Sta[0]!=0)

{

//输出数据

for(int i =0i<Ni++)

{

cout<<a[i][Sta[i]-1]<<" "

}

Sta[N-1] = Sta[N-1]-1

AdjustSta()

cout<<Count++<<endl

}

getchar()

return 1

}

第二个问题在输出的地方改为和判断,如果相等就输出即可者旁,代码我不写了

1)

#include<stdio.h>

long fac(int n)

{

if(n==0||n==1)return 1

else return n*fac(n-1)

}

void main()

{int n

scanf("%d",&n)

printf("%d!=%ld\毕团拍n"手羡,n,fac(n))

}

2)

#include<stdio.h>或弯

void main()

{int n,i

long s=1

scanf("%d",&n)

for(i=2i<=ni++)

s*=i

printf("%d!=%ld\n",n,s)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12345329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存