首页 > 学院 > 开发设计 > 正文

计算组合数

2019-11-10 18:26:46
字体:
来源:转载
供稿:网友

编写函数,参数是两个非负整数n和m,返回组合数(符号不会打(⊙﹏⊙)b)!!!

很简单是吧,正好用到了刚才的阶乘。

#include<iostream>using namespace std;long long factorial(int n){    long long m=1;    for(int i=1;i<=n;i++){        m*=i;    }    return m;}long long C(int n,int m){    return factorial(n)/(factorial(m)*factorial(n-m));}int main(){
        int n,m; while(cin>>n>>m){ cout<<C(n,m)<<endl; } return 0;}

但,发现WA了。。。

当输入哪n = 21,m = 1时,输出的是-1  明显不对。说明中间是结果溢出了。

那么,怎么解决呢?

我们可以约分。

n!/m!=(m+1)(m+2)...(n-1)n;

所以,代码如下:

#include<iostream>using namespace std;long long C(int n,int m){    if(m<n-m)        m=n-m;    long long ans = 1;    for(int i=m+1;i<=n;i++)        ans*=i;    for(int i=1;i<=n-m;i++)        ans/=i;    return ans;}int main(){    int n,m;    while(cin>>n>>m){        cout<<C(n,m)<<endl;    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表