算法竞赛--组合数计算

组合数的计算

1
2
3
4
5
6
7
8
9
long long fact(long long n,long long m)
{
long long ans=1;
for(long long i=1;i<=m;i++)
{
ans=ans*(n-m+i)/i;
}
return ans;
}

1.计算组合数

编制程序,输入m,n(M>=n>=0)后,计算下列表达式的值并输出:m!/n! (m-n)!

要求将计算阶乘运算的函数写为fact(n),函数返回值的类型为float

输入信息:

m n

输出信息:

对应表达式的值

样例输入:

1
2 1

样例输出:

1
2

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
long long fact(long long n,long long m)
{
long long ans=1;
for(long long i=1;i<=m;i++)
{
ans=ans*(n-m+i)/i;
}
return ans;
}
int main()
{
long long n,m;
while(scanf("%lld%lld",&n,&m)==2)
{
long long ans=fact(n,m);
printf("%lld\n",ans);
}
return 0;
}

2.求组合数

组合数的计算虽说简单但也不乏有些陷阱,这主要是因为语言中的数据类型在表示范围上是有限的。更何况还有中间结果溢出的现象,所以千万要小心。

输入信息:

求组合数的数据都是成对(M与N)出现的,每对整数M和N满足0<m, n≤20,以EOF结束。

输出信息:

输出该组合数。每个组合数换行。

样例输入:

1
2
5 2
18 13

样例输出:

1
2
10
8568

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<bits/stdc++.h>
int main()
{
long long n,m;
while(scanf("%lld%lld",&n,&m)==2)
{
long long ans=1;
for(long long i=1;i<=m;i++)
{
ans=ans*(n-m+i)/i;
}
printf("%lld\n",ans);
}
return 0;
}
小礼物走一个哟
0%