|
//该程序是计算较大数字的阶乘的,当然最大可计算的阶乘受SIZE的限止
//一般的程序能够计算的不大于100!,要计算大数的阶乘法,就得用大数计算的方法
//我用该程序能够算出2000!,但不知道是否正确,前面的正确的
package untitled2;
import java.io.*;
public class Frame1{
public static void main(String params[ ]) throws IOException{
int N=0,Digit;
final int SIZE=200000;
int numbers[ ]=new int[SIZE+1];//存放N!的各个位
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.print(" lease Input a Number and press Enter Key:");
try{ N = Integer.parseInt(br.readLine());}//输入要计算阶乘数字
catch(Exception e){System.out.print("IO Error!");System.exit(0); }
Digit=1;numbers[1]=1;
for(int i=1;i<=N;i++){//开始循环计算阶乘
for(int j=1;j<=Digit;j++)numbers[j]*=i;//计算i!,并将初次结果放在数组中
//下面是对已经得到的阶乘进行调整,使每个数组元素只放一位数字,最高位在下次调整!
for(int j=1;j<=Digit;j++){
if (numbers[j] > 9) {
numbers[j + 1] = numbers[j + 1] + numbers[j] / 10;
numbers[j] = numbers[j] % 10;
}
}
if(numbers[Digit+1]>0)Digit+=Integer.toString(numbers[Digit+1]).length();//计算当前的总位数
//下面是防止数组溢出
if(Digit>=SIZE-1){
System.out.println("Array IndexBound Overflow!");
System.out.println("Lotal numbers:"+Digit);
System.exit(0);
}
}
int K=numbers[Digit+1]>0?Digit+1: Digit;
System.out.print(N+"!=");
for(int j=K;j>0;j--)System.out.print(numbers[j]);//输出i的阶乘
System.out.print("\n");
}
} |
|