求级数e=1+1/1! +1/2! +1/3!+… 要求:求n项(n由键盘输入)或最后一项小于10-6结束。
时间: 2023-10-09 22:12:42 浏览: 125
算法1:直接计算
直接按照公式计算即可,由于计算机的计算精度有限,为了避免误差累积,可以使用BigDecimal类进行精确计算。
时间复杂度:$O(n^2)$
空间复杂度:$O(1)$
Java 代码
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
BigDecimal e = BigDecimal.ONE;
BigDecimal factorial = BigDecimal.ONE;
for (int i = 1; i <= n; i++) {
factorial = factorial.multiply(BigDecimal.valueOf(i));
e = e.add(BigDecimal.ONE.divide(factorial, 100000, BigDecimal.ROUND_HALF_UP));
if (BigDecimal.ONE.divide(factorial, 100000, BigDecimal.ROUND_HALF_UP).compareTo(BigDecimal.valueOf(0.000001)) < 0) {
break;
}
}
System.out.println(e);
}
}
算法2:递归计算
递归计算的思路是,每一项都等于上一项除以当前项的阶乘再加上1,当当前项小于10^-6时结束递归。
时间复杂度:$O(n)$
空间复杂度:$O(n)$
Java 代码
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
BigDecimal e = calcE(BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, n);
System.out.println(e);
}
private static BigDecimal calcE(BigDecimal e, BigDecimal factorial, BigDecimal i, int n) {
if (i.compareTo(BigDecimal.valueOf(n)) > 0 || BigDecimal.ONE.divide(factorial, 100000, BigDecimal.ROUND_HALF_UP).compareTo(BigDecimal.valueOf(0.000001)) < 0) {
return e;
}
factorial = factorial.multiply(i);
e = e.add(BigDecimal.ONE.divide(factorial, 100000, BigDecimal.ROUND_HALF_UP));
return calcE(e, factorial, i.add(BigDecimal.ONE), n);
}
}
阅读全文