今天看了一篇博客,它是先把每个位置加起来,最后再进行进位操作,数字够大后,存在溢出可能性。
链接如下:https://blog.csdn.net/baokx/article/details/39005159
注意:
计算较大的阶乘时,eclipse运行的话,前面的结果可以正常输出,后面较大的结果只会输出空白。我在命令行用javac编译运行,得到结果是正常的。
我在他的基础上改了下,实现如下:
public class MyTest{
public static int [] multi(StringBuffer str1, StringBuffer str2) {
//将接收到的字符串转化成倒序的char数组
char[] nums1 = str1.reverse().toString().toCharArray();
char[] nums2 = str2.reverse().toString().toCharArray();
//预先声明一个数组,用来存放各个位数相乘的结果(类似于列竖式)
int len = nums1.length+nums2.length;
int [] array = new int[len];
//n位数和n位数相乘,得到的结果的位数只能是2n-1或者2n。
//把2n位设置为-1,用来标记最终结果到底是多少位。
array[len-1] =-1;
//模拟竖式计算
int jinWei = 0,//存储进位
temp;
for(int i = 0,j ; i < nums2.length ; i++){
jinWei = 0; //进位归位
for(j = 0 ; j < nums1.length ; j++){
temp = (nums2[i]-48)*(nums1[j]-48) + jinWei + array[i+j];
array[i+j] = temp%10;
jinWei = temp /10;
}
if(jinWei !=0)
array[i+j] = jinWei;
}
return array;
}
/**
* 处理multi方法最终得到的数组。
*/
public static StringBuffer arrayFormat(int [] array){
StringBuffer buffer = new StringBuffer();
for(int i =0;i<array.length-1;i++){
buffer.append(array[i]);
}
if(array[array.length -1] != -1)
buffer.append(array[array.length -1]);
return buffer.reverse();
}
public static void main(String[] args) {
//测试:输出100的阶乘
StringBuffer buffer = new StringBuffer("1");
for(int i=1;i<=100;i++){
buffer = arrayFormat(multi(new StringBuffer(""+i),buffer));
System.out.print(i+" ");
System.out.println(buffer.toString());
}
}
}
在命令行用上面的代码计算10000的阶乘:
用BigInteger计算10000的阶乘:
可以看出结果完全一样。