Java算法:1!+2!+3!+···+n!求和

方法1(累加):

1!+2!+3!+···+n!
其中 n! = 1 * 2 * 3 * ··· * n
两层for循环,内层for循环输出 An = n!(n遍历1~n),外层for循环执行 A1+A2+A3+···+An = num

public void play2() {
	//命令行输入操作
	@SuppressWarnings("resource")
	int n = new Scanner(System.in).nextInt();
	//算法开始的时间
	Date date1 = new Date();
	System.out.println("开始时间: " + date1);
	//开始执行算法
	long num = 0;
	for(int i=1;i<=n;i++) {
		long a = 1;
		for(int j=1;j<=i;j++) {
			a = a*j;
		}
		num = num + a;
		System.out.println(" + " + i + "!");
	}
	System.out.println(" = " + num);//输出计算结果
	//算法结束的时间
	Date date2 = new Date();
	System.out.println("结束时间: " + date1);
	//算法执行所用的时间
	long timeSpan = date2.getTime() - date1.getTime();
	System.out.println(timeSpan + "ms");//输出算法的执行时间
}

方法2(递归):

可以通过数学计算,找到公式,再去执行算法
1!=(0+1)*1
1!+2!=(0+1)*2+1
1!+2!+3!=[(0+1)*3+1]*2+1
1!+2!+3!+4!={[(0+1)*4+1]*3+1}*2+1

依次可以推出1!+2!+···+n!之和
上述括号中的0,可以看作初始值为0
我们可以得到一个函数公式:F(x) = ( F(x-1)+1 ) * x ; F(0) = 0 ;
所以用递归法实现

public void play2_1() {
//命令行输入操作
	@SuppressWarnings("resource")
	int n = new Scanner(System.in).nextInt();
	//算法开始的时间
	Date date1 = new Date();
	System.out.println("开始时间: " + date1);
	//开始执行算法
	long num = 0;
	for(int i=n;i>0;i--) {
		num = (num + 1)*i;
		System.out.println(" + " + i + "!");
	}
	System.out.println(" = " + num);
	//算法结束的时间
	Date date2 = new Date();
	System.out.println("结束时间: " + date1);
	//算法执行所用的时间
	long timeSpan = date2.getTime() - date1.getTime();
	System.out.println(timeSpan + "ms");
}

结果:

输入值为999999

方法一的结果
在这里插入图片描述

方法二的结果
在这里插入图片描述

怎么样,还是只套一层for循环的算法快吧 :·)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值