关于c语言组合数精确度问题

来源:互联网 发布:整理通讯录的软件 编辑:程序博客网 时间:2024/04/30 20:49

本文属原创   ,   转载请注明出处

最近遇到几个组合数的问题,无论怎么写答案都有错,不知道错在哪,,不过今天写了一个程序测试,测试的问题是  int    long long int double 三个类型的C(m,n)的范围,


组合数 即  C(m,n)     即  m*(m-1)*(m-2)……(m-n+1)/ (n!);  可以理解为 ((m!) / (m-n)! ) /n!;  


当然,用int的话  只能运算 16的阶乘   所以就需要像个办法简化这个过程,让int可以存下结果值,,


上述公式可以简化为 

(m-i+1)/ i ;i 从1 到n  


所以下面贴上代码  

<span style="font-size:14px;">#include<stdio.h>int C_int(int m, int n){int sum=1,i;for(i=1;i<=n;i++)sum=sum*(m-i+1)/i;return sum;}long long int C_llong(int m, int n){long long int sum=1,i;for(i=1;i<=n;i++)sum=sum*(m-i+1)/i;return sum;}double C_double(int m, int n){double sum=1,i;for(i=1;i<=n;i++)sum=sum*(m-i+1)/i;return sum;}int main(){int m,n;while(~scanf("%d%d",&m,&n)){printf("%12d ",C_int(m,n));printf("%22lld ",C_llong(m,n));printf("%22.0lf\n",C_double(m,n));}return 0;}</span>

上述程序写了三个返回值不同的函数,因为m,n 肯定在int范围内,就不用更改了  而且  因为 当m= 2n时   是C(m)从0到m的最大值,就拿m = 2n的情况做研究,


下面贴结果图




从图中很容易看出,,即使优化了过程,, int 也只能存下 30以内的组合数,, longlongint  可以存下70以内的,,double就不测试了,这个数据够用到100就行了,,所以组合数题目的范围如果大于上述几个值,,那么最后的就是用double   


0 0
原创粉丝点击