2017-04-15 37 views
-3
#include <stdio.h> 
#include <stdlib.h> 

int factorial(int n) { 
    int f; 

    for(f = 1; n > 0; n--) 
     f *= n; 
    return f; 
} 

int ncr(int n,int r) { 
    return factorial(n)/(factorial(n-r) * factorial(r)); 
} 

int main(int argc, char* argv[]) { 

    int n, i, j; 

    n = atoi(argv[1]); 

    for(i = 0; i <= n; i++) { 

     printf("1"); 

     for(j = 1; j <= i; j++) 
      if(i == j && j > 0) printf(" 1"); 
      else printf(" %d", ncr(i, j)); 

     printf("\n"); 
    } 
    return 0; 
} 

如果我使用12以上的数字参数进行测试,我会从第12行(?)得到奇怪的数字。为什么会发生这种情况?我应该使用malloc还是数组?有人可以将此代码更改为数组或malloc?谢谢。如何将此代码转换为数组或malloc?

+4

因子变得非常快,整数类型很快就不能代表这么大的数字...... – ForceBru

+0

如果你真的需要处理这么大的数字,请考虑类似[GNU MP Bignum库](https: //gmplib.org/)。 –

+0

如果你想解决概率问题,你应该考虑使用'double'。你会失去精确度,但如果你随着你的增长而增加,你应该没问题。记住n!/ m!意味着你可以避免在min(m,n)的顶部或底部进行乘法运算,即12!/ 10!显然是12 * 11 = 132,因为1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10被取消。 – Persixty

回答

1

为什么很奇怪?因子13是6227020800,它超过了INTMAX,所以你卷入负面的土地。 “漫长的”可能会奏效。了解尺寸限制的MAX和MIN值。

在开始设计程序之前,请务必确保您的范围。

+0

我用了很长的时间,现在能够处理高达20的参数,但是当参数是66时,我仍然得到破解号码... –

+0

因素迅速增长。看看https://gmplib.org/。尝试在无符号字符数组中使用两个程序的60位数字,每个字符中包含一个数字... unsigned char digits [60]。 – Gilbert