- 时间限制: 1 Sec 内存限制: 128 MB
题目描述
- 输入正整数A,B(0≤B≤A≤20),计算组合数。
组合数计算
输入:测试数据只有1组。
输出::每个输出占1行。
- 样例输入
0 0
1 1
4 2
5 3
10 6
15 9
- 样例输出
1
1
6
10
210
5005
- 【Solution】
- 函数
#include <stdio.h>
long long int jc(int x);
int main(int argc, char *argv[])
{
int a,b,c;
long long int sum;
scanf("%d %d",&a,&b);
c=a-b;
sum=jc(a)/(jc(c)*jc(b));
printf("%d\n",sum);
return 0;
}
long long int jc(int x){
if(x==1)
return 1;
else return jc(x-1)*x;
}
Error!
- 会提示内存超限!!!
#include<stdio.h>
int main(int argc, char* argv[])
{
int i=1;
int a,b,k;
scanf("%d %d",&a,&b);
for(k=1;k<=b;k++)
{
i=(i*(a-b+k))/k; //先算乘法,避免先算(a-b+k)/k除不尽带来误差;
}
printf("%d\n",i);
return 0;
}
Right!
#include <stdio.h>
int comb(int m,int n);
int fac(int x);
int main(void){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
printf("%d\n",comb(a,b));
}
int comb(int m,int n){
int c,sum;
c=m-n;
sum=fac(m)/(fac(c)*fac(n));
return sum;
}
int fac(int x){
if(x==1)
return 1;
else if(x==0) return 0;
else return fac(x-1)*x;
}
- 运行错误!!
#include <stdio.h>
int comb(int m,int n);
int fac(int x);
int main(void){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
printf("%d\n",comb(a,b));
}
int comb(int m,int n){
int r;
if(m==n)
return 1;
else{
r=fac(m)/fac(m-n)/fac(n);
return r;
}
}
int fac(int x){
if(x==1)
return 1;
return fac(x-1)*x;
}
- 正确!!
作品持续更新中…