一道组合数,c++代码

题目描述
给出两个非负整数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;
}

测试如图:

img

以上仅供参考,如有任何疑问,可以评论回复,看到即回。
希望对题主有所帮助!可以的话,点个采纳!