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

方法一的结果
Java算法:1!+2!+3!+···+n!求和_第1张图片

方法二的结果
Java算法:1!+2!+3!+···+n!求和_第2张图片

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

你可能感兴趣的:(Java算法)