题目:求1+2!+3!+…+20!的和。
程序分析
我们需要计算从1到20的阶乘并将它们相加。阶乘是一个数与所有比它小的正整数的乘积。例如,5! = 5 * 4 * 3 * 2 * 1
。
方法1:使用循环计算阶乘和求和
解题思路
- 使用循环计算从1到20的每个数的阶乘,并将它们相加。
代码实现
public class FactorialSum {
public static long factorial(int n) {
long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
public static long calculateSum() {
long sum = 0;
for (int i = 1; i <= 20; i++) {
sum += factorial(i);
}
return sum;
}
public static void main(String[] args) {
long sum = calculateSum();
System.out.println("The sum of factorials from 1 to 20 is: " + sum);
}
}
优缺点
- 优点:
- 简单、直接,易于理解和实现。
- 缺点:
- 需要计算20次阶乘,时间复杂度较高。
方法2:优化计算阶乘和求和
解题思路
- 在计算阶乘时,可以保存上一次的阶乘结果,避免重复计算。
代码实现
public class FactorialSum {
public static long factorial(int n) {
long result = 1;
long prev = 1;
for (int i = 2; i <= n; i++) {
result = prev * i;
prev = result;
}
return result;
}
public static long calculateSum() {
long sum = 0;
for (int i = 1; i <= 20; i++) {
sum += factorial(i);
}
return sum;
}
public static void main(String[] args) {
long sum = calculateSum();
System.out.println("The sum of factorials from 1 to 20 is: " + sum);
}
}
优缺点
- 优点:
- 减少了阶乘的重复计算。
- 缺点:
- 相对复杂一些。
方法3:使用递归计算阶乘和求和
解题思路
- 使用递归计算阶乘,并将阶乘结果相加。
代码实现
public class FactorialSum {
public static long factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
public static long calculateSum(int n) {
long sum = 0;
for (int i = 1; i <= n; i++) {
sum += factorial(i);
}
return sum;
}
public static void main(String[] args) {
long sum = calculateSum(20);
System.out.println("The sum of factorials from 1 to 20 is: " + sum);
}
}
优缺点
- 优点:
- 递归思路清晰。
- 缺点:
- 可能在大规模n下会导致栈溢出,不适用于极大的n。
总结和推荐
- 推荐方法1(使用循环计算阶乘和求和):
- 简单、直接,易于理解和实现。
综上所述,推荐使用方法1来计算从1到20的阶乘并求和。