题目描述
给出两个非负整数n和m,编写程序计算组合数C(n,m)的值。
输入格式
一行两个空格隔开的非负整数n,m。
输出格式
输出一个数表示C(n,m)。
输入样例
5 2
输出样例
10
数据范围与提示
数据范围:
0<n<=20,0<=m<=n。
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long data[10005];
int main(){
data[0]=1;
cin>>n>>m;
m=min(m,n-m);
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
data[j]=data[j]+data[j-1];
}
}
cout<<data[m];
}
#include <iostream>
int main()
{
int m, n;
std::cin >> n >> m;
unsigned long long a = 1, b = 1;
for (int i = 1; i <= m; i++)
{
a *= i;
b *= (n - i + 1);
}
std::cout << b / a << '\n';
return 0;
}
思路:这道题比较容易想到的思路是分别求出n!,m!,(n-m)!,然后利用组合数公式计算。然而,int类型的变量只能存储13以内的数的阶乘,long long类型的变量只能存储到20的阶乘。要计算组合数,就要边乘边除,这样才能继续计算下去。
公式:C(n,m) = n! /(m! * (n-m)!) = (m+1) * (m+2) * (m+3)… * n / (1 * 2 * 3 * … * (n-m)),分子和分母各有(n-m)项,我们用循环来实现。
#include<iostream>
using namespace std;
int main()
{
long long n,m,res=1;
cin >>n>>m;
for(int i=1; i<=n-m; i++)
{
res=res*(m+i)/i;
}
cout << res; return 0;
}
测试如图:
以上仅供参考,如有任何疑问,可以评论回复,看到即回。
希望对题主有所帮助!可以的话,点个采纳!