这题目不是很简单吗?各种念头(循环、递归),这题目简单到不能再简单了,根本,没有难度!
public static int funcion(int n){
if(n==1)
return 1;
return n*funcion(n-1);
}
调用上面的递归函数n=100,控制台输出结果是0!!!一下子懵了,怎么可能是0!细想了一下,int的范围-231——231-1,大概是21亿左右,100!将int改为float,输出结果是Infinity;double输出的是9.33262154439441E157(科学计数法,根本不知道结果是多少)。那用java的大整数BigInteger总可以了吧,事实证明大整数是可以输出正确的结果的。打开大整数类的源码,看到BigInteger类也是基于数组实现的,那求100!是不是也可以用数组存储来实现呢?
上面的图片是求8969269,将其中大的数8969存储在一个数组中,每一个数字占数组中的一个位置,再将数组中的每一位数字与269相乘,相乘的结果存储在数组中对应的位置。数组中个位数9269得到的是2421,2421/10=242,2421%10=1,那么2421的前一个1614要加上242,2121则等于2421%10=1。后面的数字处理使用相同的办法,求100!实现代码如下:
public static void main(String[] args) {
int[] ints=new int[100];
ints[0]=1;
for (int n=1;n<=100;n++){
ints=multiply(ints, n);
}
boolean begin=false;
for (int i=ints.length-1;i>=0;i--){
if(!begin){
if(ints[i]>0){
begin=true;
}
}
if(begin){
System.out.print(ints[i]);
}
}
}
public static int[] multiply(int[] ints,int n){
for (int i=0;i<ints.length;i++){
ints[i]*=n;
}
for (int i=0;i<ints.length-1;i++){
ints[i+1]+=ints[i]/10;
ints[i]=ints[i]%10;
}
return ints;
}