大数阶乘
比如求100的阶乘,开始初始化 a[0] = 1,此时 digit 等于 1,数组中有效数据:1;
然后用 2 去乘 a[0],即2 * 1 = 2,将 2 存储到a[0],此时 digit 等于 1,数组中有效数据:2;
然后用 3 去乘 a[0],即3 * 2 = 6,将 6 存储到a[0],此时 digit 等于 1,数组中有效数据:6;
然后用 4 去乘 a[0],即4 * 6 = 24,将 24 的最低位 4 存储到a[0]中,此时进位为2,然后将进位 2 存储到a[1]中,然后将 digit 加 1,此时 digit 等于 2,数组中有效数据:4 2;
然后用 5 去乘 a[0],即 5 * 4 = 20,将 20 的最低位 0 存储到a[0]中,此时进位为 2,然后用 5去乘a[1]再加上进位2,即 5 * 2 + 2 = 12,将12的最低位2存储到a[1]中,此时进位为1,然后将进位的 1 存储到a[3]中。此时 digit 等于 3,数组中有效数据 0 2 1。
剩下的依此类推。
思路分析:
乘法规则:让乘数与被乘数的低位到高位依次相乘,加上每位计算的进位数,依次得到每一位的结果。
程序模拟时,无论乘数有多少位,都将乘数看成一个整体,与被乘数的低位相乘加上该位的进位数得到临时变量,取临时变量的最后一位得到我们需要的一位(%10),并存储到数组中,除去最低位后的数作为下一位的进位数(up = temp/10)。被乘数的每一位都被乘完之后,如果进位数不为0,说明结果需要扩大,则将剩余结果输入到数组中,并增加记录位数的digit
public class BigNumJieCheng {
public static void main(String[] args) {
int n = 100;
int[] a = new int[20001];
a[0] = 1;//从1开始乘
int digit = 1;//记录数组中结果的位数
int temp = 0;//记录每次运算后的得数
for(int i = 2; i <= n; i++){
int up = 0;//存储进位,比如4 * 6的时候,会产生2这个进位
for(int j = 0; j < digit; j++){// 让数组a中的每一位有效元素都与i相乘
temp = a[j] * i + up;//将存储在数组中的数分别乘以i,并加上进位的数up
a[j] = temp % 10;//将得数的最后一位进行存储
up = temp / 10;
}
while(up != 0){
a[digit] = up % 10;
up = up / 10;
digit++;
}
}
for(int i = digit - 1; i >= 0; i--){
System.out.print(a[i]);
}
}
}