所念皆所得吖 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 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了