计算50的阶乘

阶乘的计算在学习过程中很常见,但是对于编程来说,由于涉及到基本数据类型的长度有限,当要计算50的阶乘时,不管是int,还是long,都不能有效来存储这个庞大的结果。
为了解决这个问题,可以引入数组,用数组存储大数据,通过数组的每一位模拟数字的个十百千位来实现大数据运算。
一、基本算法思想如下:
1、假设要计算512*34(512代表了大数据),可以用一个数组int[] ints存储512:数组从后往前一次表示个、十、百、千位。
计算50的阶乘_第1张图片
2、计算每一位与乘数的计算结果:
计算50的阶乘_第2张图片
3、对相乘后的每一位做进位留位操作:从后往前依次对每一位除以10,余数留在本位,整数进位与前一位作和。
计算50的阶乘_第3张图片
所以,结果应为: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]);
        }
    }
}

结果:在这里插入图片描述

。。。。。。。。。。。。。。。。
只有真正喜欢,才是最大的动力。
。。。。。。。。。。。。。。。。

你可能感兴趣的:(计算50的阶乘)