阶乘的计算在学习过程中很常见,但是对于编程来说,由于涉及到基本数据类型的长度有限,当要计算50的阶乘时,不管是int,还是long,都不能有效来存储这个庞大的结果。
为了解决这个问题,可以引入数组,用数组存储大数据,通过数组的每一位模拟数字的个十百千位来实现大数据运算。
一、基本算法思想如下:
1、假设要计算512*34(512代表了大数据),可以用一个数组int[] ints存储512:数组从后往前一次表示个、十、百、千位。
2、计算每一位与乘数的计算结果:
3、对相乘后的每一位做进位留位操作:从后往前依次对每一位除以10,余数留在本位,整数进位与前一位作和。
所以,结果应为:17408。
二、用代码实现上述算法:
int[] ints ={0,5,1,2};
int num=34;
//计算每一位相乘的结果
for (int i = 0; i < ints.length; i++) {
ints[i]=ints[i]*num;
}
//对每一位进行进位和留位
for (int i = ints.length-1; i >0 ; i--) {
//进位:除以10,整数进
ints[i-1]+=ints[i]/10;
//留位:除以10,余数留
ints[i]=ints[i]%10;
}
三、计算50 的阶乘:
根据上述算法思想和其实现,接下来做一个完整的代码实现50阶乘:
首先需要将上述计算相乘的代码用一个方法operation()封装起来,具体代码如下:
package packing;
/**
* @author wangjie
* @version 2018/11/12
* 使用数组存储大数据:计算50的阶乘
*/
public class JieCheng {
//定义一个方法operation(),用数组存储结果
public static int[] operation(int[] ints,int num){
//计算每一位相乘的结果
for (int i = 0; i < ints.length; i++) {
ints[i]=ints[i]*num;
}
//对每一位进行进位和留位
for (int i = ints.length-1; i >0 ; i--) {
//进位:除以10,整数进
ints[i-1]+=ints[i]/10;
//留位:除以10,余数留
ints[i]=ints[i]%10;
}
return ints;
}
public static void main(String[] args){
int[] result = new int[100];
int num=50;
result[result.length-1] =1; //乘数
//计算阶乘
for(int i=1;i<=num;i++){
result=operation(result,i);
}
//输出结果
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]);
}
}
}
结果:
。。。。。。。。。。。。。。。。
只有真正喜欢,才是最大的动力。
。。。。。。。。。。。。。。。。