两个大阶乘相除溢出。急救。
阿博 2004-10-18 04:54:12 我要求一个组合问题。公式为 N! / ( k!*(n-k)! )
当N=292时,并且仅当 k = 132 ...160 时,我的算法走不下去了。
我的算法已经作如下优化处理
(1)分子分母已经约去。如:假设 n-k > k ,则公式变为:
n*(n-1)*(n-2)*...*(n-k+1)
-------------------------
k*(k-1)*(k-2)*...*1
(2)分子分母都把偶数除以2,即: n,n-1,n-2 ... , k,k-1,k-2,... 凡是偶数都先除以2再参与计算。
发现:当 k=140时,还能有结果。当 k=145,JVM提示:Infinity
---- 求求兄弟们帮忙,建议一个好方法 。以下是源码:
public static double zhuhe(int n , int k ){
double N1 = 1d ; // 存放公式中的被除数 N! 约去 max(K!,(N-k)!)后的值。
double N2 = 1d ; // 存放公式中 min(K!,(N-K)!)中的值。
int i_max = Math.max(k,n-k);
int i_min = Math.min(k,n-k);
int i_N1_oushu = 0; // 记录分子(N1)最小值是否偶数。1表示偶数,0表示奇数。
if( (float)i_max/2.0 > Math.round((float)i_max/2.0) ){
i_N1_oushu = 1 ; // i_max是奇数。分子(N1)最小值(i_max+1)是偶数
}
int i_N2_oushu = 0; // 分母肯定是奇数开始,因为从1开始。
int m = 1;
while ( m <= i_min ){
if( i_N1_oushu == 1 ){
N1*=((m+i_max)/2);
i_N1_oushu = 0 ;
}
else {
N1 *= (m + i_max);
i_N1_oushu = 1 ;
}
if( i_N2_oushu == 1) {
N2*=m/2;
i_N2_oushu = 0 ;
}
else{
N2 *= m;
i_N2_oushu = 1 ;
}
m++;
}
return N1/N2;
}