public class TestRecursive2 {
public static int N = 1000000000;// 以1,000,000,000为基数
public static int bit = 1; // 记录数的位数 如上面的就有3位(以N为基)
public static int zero = 0; // b是低位乘出来的0000000000的数目
public static int answer = 0;
public static void main(String[] args) {
int[] result = new int[100000000];// 用于存储结果的数组
// ,如s[0]=1,s[1]=21,s[2]=213,s[3]以上都为0,
// 则结果是:213,000000021,000000001
int num = 1000;// 要计算到的位数
// 附初值,S=1,即result[0]=1,以上都为0
for (int i = 1; i < 6; i++) {
result[i] = 0;
}
result[0] = 1;
// 循环,s乘以2、3、4,……,num
for (int i = 2; i <= num; i++) {
bignum(result, i);
}
System.out.println(System.currentTimeMillis());
// 输出结果
for (int i = result.length - 1; i >= 0; i--) {
if(result[i]!=0){
//System.out.print(result[i] + ",");
}
}
System.out.println(System.currentTimeMillis());
}
/*
* bignum
*/
public static void bignum(int[] result, int num) {
long p = 0; // p是对每一位乘法中的值加上进位,如34*5,4*5是20,3*5的加上进位2是17
long k = 0; // k是一次乘法中的进位,如10进制乘法中,34*5,4*5的进位是2,3*5的进位是1 (15/10 = 1)
for (int i = zero; i < bit; i++) {
// 位上为0的不参与计算
p = (long) result[i] * (long) num + k; // 注意:此处必须转化为long型
// System.out.println("num= "+num);
// System.out.println("p= "+p);
k = p / N;
result[i] = (int) (p - k * N);
// System.out.println(i + " " +result[i]);
}
// 最高位的进位处理
for (k = p / N; k != 0;) {
p = k;
k = p / N;
result[bit++] = (int) (p - k * N);
bit++; // 进一次m加一次
}
// b是低位乘出来的000的数目,增加后加1
while (result[zero] == 0) {
zero++;
}
}
}
简单的java大数阶乘运算算法
5星 · 超过95%的资源 需积分: 49 122 浏览量
2014-01-25
23:44:12
上传
评论
收藏 4KB ZIP 举报
sjyhehe
- 粉丝: 27
- 资源: 5