题目介绍
# [NOIP1998 普及组] 阶乘之和
## 题目描述
用高精度计算出 $S = 1! + 2! + 3! + \cdots + n!$($n \le 50$)。
其中 `!` 表示阶乘,定义为 $n!=n\times (n-1)\times (n-2)\times \cdots \times 1$。例如,$5! = 5 \times 4 \times 3 \times 2 \times 1=120$。
## 输入格式
一个正整数 $n$。
## 输出格式
一个正整数 $S$,表示计算结果。
## 样例 #1
### 样例输入 #1
```
3
```### 样例输出 #1
```
9
```## 提示
**【数据范围】**
对于 $100 \%$ 的数据,$1 \le n \le 50$。
**【其他说明】**
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 $n \le 20$,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。
不使用高精度的代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextInt();
long sum = 0;long x = 1;
for (long i = 1; i <= n; i++) {
x *= i;
sum += x;
}
System.out.println(sum);
}
}
使用高精度的代码
import java.math.BigInteger;
import java.util.Scanner;
public class Text00 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextInt();
BigInteger x = new BigInteger("1");
BigInteger sum = new BigInteger("0");
for (long i = 1; i <= n; i++) {
x = x.multiply(BigInteger.valueOf(i));
sum = sum.add(x);
}
System.out.println(sum);
}
}
逻辑解释 Java高精度
Java中的高精度计算通常指的是能够处理比基本数据类型(如int、long、double等)更大范围和更高精度的数值运算。这种能力主要通过Java标准库中的BigInteger和BigDecimal类来实现。
-
BigInteger类:
BigInteger
类用于表示任意精度的整数。它可以处理比long类型范围更大的整数,并支持基本的整数运算,如加减乘除、求幂、取余等。- 使用
BigInteger
类,您可以在程序中处理超过64位长的整数,这对于需要高精度计算的情况非常有用,比如密码学算法、大数运算等。 - 示例用法:
import java.math.BigInteger; public class BigIntegerExample { public static void main(String[] args) { BigInteger num1 = new BigInteger("123456789012345678901234567890"); BigInteger num2 = new BigInteger("987654321098765432109876543210"); BigInteger sum = num1.add(num2); System.out.println("Sum: " + sum); } }
-
BigDecimal类:
BigDecimal
类用于表示任意精度的浮点数。它可以处理比double类型更高精度的浮点数,并支持基本的浮点数运算,如加减乘除、取余等。- 使用
BigDecimal
类,您可以在程序中进行精确的货币计算、税务计算等需要精确小数的情况。 - 示例用法:
import java.math.BigDecimal; public class BigDecimalExample { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("1234.56789"); BigDecimal num2 = new BigDecimal("9876.54321"); BigDecimal sum = num1.add(num2); System.out.println("Sum: " + sum); } }
这些高精度类在处理大数值或需要精确计算的情况下非常有用。但需要注意的是,由于高精度计算会消耗更多的内存和计算资源,因此在性能要求较高的场景下需要谨慎使用。