输出组合数和排列数
#include<stdio.h>
typedef long long LL;
LL factorial(int num){
LL mul;
if (num==0) mul=1;
else mul=num*factorial(num-1);
return mul;
}
void cp_mn(int m,int n, LL a[]){
a[1]=factorial(m)/factorial(n)/factorial(m-n);//A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!
a[2]=factorial(m)/factorial(m-n); //C(n,m)=A(n,m)/m!=n!/((n-m)!*m!);
}
int main(){
int a,b;
LL cp[2];
printf("input 2 numbers:\n");
scanf("%d %d",&a,&b);
cp_mn(a,b,cp);
printf(" 组合数: %ld,排列数 %ld\n",cp[1],cp[2]);//组合数认为(1,2)和(2,1)是同样的组合
}
计算组合数
题目描述
计算组合数。C(n,m),表示从n个数中选择m个的组合数。计算公式如下:
C(n,m) = C(n-1,m-1) + C(n-1,m).
输入
第一行是正整数N,表示有N组要求的组合数。接下来N行,每行两个整数n,m (0 <= m <= n <= 20)。
输出
输出N行。每行输出一个整数表示C(n,m)。
#include<stdio.h>
int sum(int n,int m) {
if(m==0||n==1||m==n) return 1;
else return sum(n-1,m-1)+sum(n-1,m);
}
int main() {
int N;
scanf("%d",&N);
while(N--) {
int n,m;
scanf("%d %d",&n,&m);
printf("%.0d\n",sum(n,m));
}
return 0;
}
解法2
#include<stdio.h>
double fac(int k) {
double mul=0;
if (k==0) mul=1;
else mul=k*fac(k-1);
return mul;
}
double cmn(int m,int n) {
double res;
res=fac(m)/(fac(n)*fac(m-n));
return res;
}
void main() {
int m,n,i,b;
double t;
scanf("%d",&b);
for(i=0;i<b;i++) {
scanf("%d %d",&m,&n);
t=cmn(m,n);
printf("%.0lf\n",t);
}
}