给定一个参数N,返回:1! + 2! + 3! + 4! +...+ N!的结果

题目:给定一个参数N,返回:1! + 2! + 3! + 4! +…+ N!的结果

话不多说我们直接上代码

package com.lbmb.chapter01_bitOperation;

/**
 * @author 林文塨
 * @date 2022-07-02 23:33
 * description 给定一个参数N,返回:1! + 2! + 3! + 4! +...+ N!的结果
 */
public class Code02 {

    public static long factorial01(int n) {
        /*
         * 暴力解决,用两个循环
         * 外层循环N次
         * 内层循环1~N的阶层
         * @author 林文塨
         * @date 2022/7/2 23:35
         * @param []
         * @return long
         */
        long result = 0;
        for (int i = 1; i <= n; i++) {
            long temp = 1;
            for (int j = 1; j <= i; j++) {
                temp *= j;
            }
            result += temp;
        }
        return result;
    }

    public static long factorial02(int n) {
        /*
         * 用一个变量记住上一次计算的值,不用每次都重复计算已计算过的值
         * @author 林文塨
         * @date 2022/7/2 23:42
         * @param [n]
         * @return long
         */
        long result = 0;
        long temp = 1;
        for (int i = 1; i <= n; i++) {
            temp *= i;
            result += temp;
        }
        return result;
    }

    public static void main(String[] args) {
        int n = 5;
        System.out.println(factorial01(5));
        System.out.println(factorial02(5));
    }
}

解决方法一:
暴力穷举,分两步走,用两个循环,求1! + 2! + 3! + 4! +…+ N!的结果,外层循环N次,内层则循环每个阶乘1!,2!,3!,4!,…,N!

//外层循环,这里选择从i=1 ~ i<=n而不是i=0 ~ i<n,是为了后面阶乘从1开始而不是从0开始
for (int i = 1; i <= n; i++) {

}
//内层循环,每次循环完临时变量的值都为1 * 2 * 3 * ... * i,这里的i是上边外层循环的变量
long temp = 1;
for (int j = 1; j <= i; j++) {
    temp *= j;
}

实质上就是直接算:

1! = 1
2! = 1*2
3! = 1*2*3
...
N! = 1*2*3*4...*N

最后全部相加 1! + 2! + 3! + 4! +…+ N!

解决方法二:
从方法一中我们可以发现,在计算

1! = 1
2! = 1*2
3! = 1*2*3
...
N! = 1*2*3*4...*N

的时候,我们重复计算了许多值,我们在算 2! 的时候算了1×2,在算3!的时候又算了1×2,然后再×3。由此可以得出结论,如果我们每次计算阶乘的时候,都用一个变量记住,再次直接从前面的基础上乘上新的值,就能大大减少计算量

long result = 0;
long temp = 1;
//循环n次,也是一样i=1 ~ i<=n
for (int i = 1; i <= n; i++) {
	//计算每个阶乘,不再初始化成1
    temp *= i;
    //将每个阶乘结果累加
    result += temp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值