转载请注明出处:http://blog.csdn.net/ZhouLi_CSDN/article/details/46316855
很久没写算法了,今天突然想写一下大数阶乘运算,花了一个多小时写了一个demo,具体算法时间空间复杂度优化并没有考虑,有兴趣可以自己研究一下。
什么都不用说了附上代码:
public class BigNumber {
public static void main(String[] args) {
//阶乘因子
int jie = 8000;
int[] num1 = new int[5];
int[] num2 = new int[30000];
int[] result = new int[30000];
int length1 = num1.length;
int length2 = num2.length;
int length3 = result.length;
// int g = 0;
num1[0] = 1;
num2[0] = 1;
for (int i = 1; i < jie; i++) {
// 初始化num1 12345
num1[0] = i % 10;
num1[1] = (i / 10) % 10;
num1[2] = (i / 100) % 10;
num1[3] = (i / 1000) % 10;
num1[4] = (i / 10000) % 10;
//g表示进位
int g = 0;
for (int j = 0; j < length1; j++) {// num1
for (int m = 0; m < length2; m++) {// num2
if ((m + j + 1) > 29999) {
break;
}
int r = num1[j] * num2[m] + result[m + j] + g;
g = 0;
if (r > 9) {
result[m + j] = r % 10;
g = r / 10;
} else {
result[m + j] = r;
}
}
}
//将一次计算结果进行转换
for (int k = 0; k < length2; k++) {
num2[k] = 0;
num2[k] = result[k];
result[k] = 0;
}
}
//输出结果
int flag = 0;
int fuck = 0;
for (int k = 29999; k >= 0; k--) {
if (num2[k] != 0) {
flag = 1;
fuck++;
System.out.print(num2[k]);
} else {
if (flag == 1) {
fuck++;
System.out.print(num2[k]);
}
}
if(fuck%60 == 0 && fuck != 0){
System.out.println("\n");
}
}
System.out.println("\n" + fuck + "");
}
}
注释写的很清楚,可以尝试运行检验结果: