记一次面试算法题--求100!

这题目不是很简单吗?各种念头(循环、递归),这题目简单到不能再简单了,根本,没有难度!

public static int funcion(int n){
        if(n==1)
            return 1;
        return n*funcion(n-1);
    }

调用上面的递归函数n=100,控制台输出结果是0!!!一下子懵了,怎么可能是0!细想了一下,int的范围-231——231-1,大概是21亿左右,100!将int改为float,输出结果是Infinity;double输出的是9.33262154439441E157(科学计数法,根本不知道结果是多少)。那用java的大整数BigInteger总可以了吧,事实证明大整数是可以输出正确的结果的。打开大整数类的源码,看到BigInteger类也是基于数组实现的,那求100!是不是也可以用数组存储来实现呢?
思路草图
上面的图片是求8969269,将其中大的数8969存储在一个数组中,每一个数字占数组中的一个位置,再将数组中的每一位数字与269相乘,相乘的结果存储在数组中对应的位置。数组中个位数9269得到的是2421,2421/10=242,2421%10=1,那么2421的前一个1614要加上242,2121则等于2421%10=1。后面的数字处理使用相同的办法,求100!实现代码如下:

     public static void main(String[] args) {
        int[] ints=new int[100];
        ints[0]=1;

        for (int n=1;n<=100;n++){
            ints=multiply(ints, n);
        }
        
        boolean begin=false;
        for (int i=ints.length-1;i>=0;i--){
            if(!begin){
                if(ints[i]>0){
                    begin=true;
                }
            }
            if(begin){
                System.out.print(ints[i]);
            }
        }
    }

    public static int[] multiply(int[] ints,int n){
        for (int i=0;i<ints.length;i++){
            ints[i]*=n;
        }
        for (int i=0;i<ints.length-1;i++){
            ints[i+1]+=ints[i]/10;
            ints[i]=ints[i]%10;
        }
        return ints;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值