所念皆所得吖 2023-01-30 21:19 采纳率: 69.2%
浏览 31
已结题

C++组合数不知道错哪

输入两个正整数n、m,要求输出组合数C(n,m)。
例如,当n=5、m=3时,组合数C(5,3)=(5×4×3)/(3×2×1)=10。
组合数可用以下公式计算:

img

输入格式:
测试数据有多组,处理到文件尾。每组测试输入两个整数n,m(0 < m ≤ n ≤ 20)。

输出格式:
对于每组测试,输出组合数。

输入样例:
5 3
20 12
输出样例:
10
125970

#include<iostream>
using namespace std;
int main(){
    int n,m;
    while(cin>>n>>m){
        int a=1,b=1,c=1,sum=0;
        for(int i=1;i<=n;i++){
            a*=i;
        }
        for(int j=1;j<=m;j++){
            b*=j;
        }
        for(int q=1;q<=(n-m);q++){
            c*=q;
        }
        sum=a/(b*c);
        cout<<a<<" "<<b<<" "<<c<<endl;
        cout<<sum<<endl;
    }
    return 0;
}

  • 写回答

2条回答 默认 最新

  • P2441M 2023-01-30 21:45
    关注

    应该是因为:

    1. 溢出。int存不下这么大的数字(毕竟20!可是很大的),改成long long。
    2. 多输出了一句cout<<a<<" "<<b<<" "<<c<<endl,根据题目输出,这句是不需要的(不知道是不是测试忘了删了)。
    3. 题目只输入两组数据,但是使用了while,这样会导致程序一直不退出,可能也是错误的原因。
      综上,这样改一下应该就行了:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n, m;
        for (int k = 0; k < 2; ++k)
        {
            cin >> n >> m;
            long long a = 1, b = 1, c = 1;
            for (int i = 1; i <= n; i++)
            {
                a *= i;
            }
            for (int j = 1; j <= m; j++)
            {
                b *= j;
            }
            for (int q = 1; q <= n - m; q++)
            {
                c *= q;
            }
            long long sum = a / (b * c);
            cout << sum << endl;
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 创建了问题 1月30日

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集