面试题:如何通过java代码实现阶乘的计算?如何避免精度问题?五千的阶乘能算吗?...

这两天跟朋友聊天,聊到一道题,如何计算阶乘?
废话不多说直接上代码:

方式1:

/**
     * 通过int来进行计算
     * @param a
     * @return
     */
    public static int factorial1(int a){
        int s=1;
        while (a>1){
            s*=a--;
        }
        return s;
    }

方式2:

/**
     * 通过dubbo来进行计算
     * @param a
     * @return
     */
    public static double factorial2(int a){
        double s=1.0;
        while (a>1){
            s*=a--;
        }
        return s;
    }

方式3:

/**
     * 如何处理精度的方式
     * @param a
     * @return
     */
    public static String factorial3(int a){
        int s=a,len=0;
        while (s>1){//计算最大情况下的数组长度
            len+=(""+s--).length();
        }
        int[] target=new int[len];//以最大情况去考虑被乘数的位数
        target[0]=1;//初始化被除数
        while (a>1){
            int t=a--;//定义当前的介乘数
            int q=0;//记录当前位的进位值
            for(int x=0;x<(target.length-1);x++){//遍历被乘数的位数
                int then=target[x]*t+q;//当前位的数值
                target[x]=then%10;//计算当前位的值
                q=then/10;//计算当前需要进位数
            }
        }
        /**
         * 合并输出字符串数值
         */
        StringBuilder sb=new StringBuilder();
        boolean flag=false;//记录舍零信号值
        for(int z=target.length;--z>=0;){
            if(!flag && target[z]!=0)
                flag=true;
            if(flag){
                sb.append(target[z]);
            }
        }
        return sb.toString();
    }

方式4:

/**
     * 通过BigInteger
     * @param a
     * @return
     */
    public static String factorial4(int a){
        BigInteger result = new BigInteger("1");//为result赋初始值,为1
        for (int i = 1; i <= a; i++) {
            BigInteger num = new BigInteger(String.valueOf(i));
            result = result.multiply(num);//调用自乘方法
        }
        return result.toString();
    }

方法调用:

public static void main(String[] args) {
        System.out.println(factorial1(50));
        System.out.println(factorial2(5000));
        System.out.println(factorial3(5000));
        System.out.println(factorial4(5000));
    }

实现结果:

5ec798039259667f990b7ba02c45de9e264.jpg

转载于:https://my.oschina.net/u/4133389/blog/3097405

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值