【问题标题】:How can I fix this Combinations calculating(nCr) program?如何修复此组合计算(nCr)程序?
【发布时间】:2020-05-29 16:19:24
【问题描述】:

我创建了这个简单的程序,使用 c 来计算组合。但是,每当我为变量“n”和“r”输入较大的值(如 20、30、40..)时,程序输出都是不正确的。但是这个程序适用于像 5,7,10 这样的小数字......我如何解决这个问题以找到组合,甚至为 n 和 r 输入大数字?

另外我想在这个程序中使用 nCr = n-1Cr + n-1Cr-1 规则,我正在使用 C 语言

#include <stdio.h>

int fact(int i){             

    if(i <= 1){
        return 1;       
    }
    return i * fact(i-1);
} 


int nCr(int n,int r){

    int nCr;

    if(r == 0 || n == r){
        nCr = 1;
    }else{

        nCr = (fact(n-1)/(fact(r) * fact(n-1-r))) + (fact(n-1)/(fact(r-1) * fact(n-r)));

    }
    return nCr;
}

int main(){

    int n,r;

    printf("Enter n : ");
    scanf("%d",&n);
    printf("Enter r : ");
    scanf("%d",&r);

    printf("nCr value : %d\n",nCr(n,r));
    return 0;
}

非常感谢您的回答。

【问题讨论】:

  • 阶乘增长非常迅速,对于您遇到问题的数字,它会溢出int 数据类型。
  • int fact(int i) 只适用于 fact(12) --> 479,001,600。

标签: c combinations ncr


【解决方案1】:

对于大量使用long long int 而不是int。 试试这个:

#include <stdio.h>

long long int fact(long long int i){             

if(i <= 1){
    return 1;       
}
   return i * fact(i-1);
} 


long long int nCr(long long int n,long long int r){

long long int nCr;

if(r == 0 || n == r){
    nCr = 1;
}else{

    nCr = (fact(n-1)/(fact(r) * fact(n-1-r))) + (fact(n-1)/(fact(r-1) * fact(n-r)));

}
    return nCr;
}

int main(){

    long long int n,r;

    printf("Enter n : ");
    scanf("%lld",&n);
    printf("Enter r : ");
    scanf("%lld",&r);

    printf("nCr value : %lld\n",nCr(n,r));
    return 0;
}

【讨论】:

    【解决方案2】:

    我怎样才能解决这个问题以找到组合,甚至输入大数的 n 和 r ?

    • 使用更宽的整数类型。 32 位 int 仅适用于 fact(12)

    • 在不使用 fact() 的情况下计算 nCr(int n,int r)。逐步形成乘积/商。

    • 使用浮点数学并容忍不精确性。

    让我们去 2 号门。在每个步骤中使用 */ 的想法。

    例如,有 52 张牌有 2,598,960 不同的强手。

    uintmax_t nCr(unsigned n, unsigned r) {
      uintmax_t y = 1;
      if (r <= n) {
        if (n - r + r < r + r) {
          r = n - r;
        }
        for (unsigned i = 1; i <= r; i++) {
          y = y * (n - r + i) / i;
        }
      }
      return y;
    }
    
    int main(void) {
      printf("%ju\n", nCr(52, 5));  // 2598960
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2013-01-17
      相关资源
      最近更新 更多