不用递归则可以用 公式的呀,从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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)