这道题目的解题在于将C运算简化,如果直接按照公式C =N!/((N − M)! × M!)来计算,会超出储存范围,正如题目中讲到的100!= 93,326,215,443,944,152,681,699,238,856,266,700,490,715,968,264,381,621,
468,592,963,895,217,599,993,229,915,608,941,463,976,156,518,286,253,
697,920,827,223,758,251,185,210,916,864,000,000,000,000,000,000,000,000,
我们要做的,就是将分子和分母化简,判断N!除以(N-M)!还是M!,当除了一个除数后,阶乘就可以存入double了,下面贴代码
package com.company;
import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int m,n,bigger,smaller;
double numerator,denominator;//分别是分子和分母
Scanner in = new Scanner(System.in);
while(in.hasNext())
{
n=in.nextInt();
m=in.nextInt();
if(n==0)
break;
if((n-m)<m)
{
bigger=m;
smaller=n-m;
}
else
{
bigger=n-m;
smaller=m;
}
numerator=1;
denominator=1;
for(int i=n;i>bigger;i--){
numerator*=i;
}
for(int i=1;i<=smaller;i++){
denominator*=i;
}
DecimalFormat df = new DecimalFormat("0");//Java控制输出数字小数点后几位的控制类,如果要输出后两位,则写“0.00”
System.out.println(n+" things taken "+m+" at a time is "+df.format(numerator/denominator)+" exactly.");
}
}
}