BigInteger类解决 <阶乘之和> 问题详解
在解决阶乘之和问题之前,我们需先了解BigInteger类,因为仅仅靠基本数据类型int、long,是不能完全解决问题的。
我们都知道Integer是int的包装类,int的最大值为2^31-1,超过这个范围之后,使用Integer数据类型就无法解决更大的数之间进行操作了,因此Java提供了BigInteger类。
接下来让我们了解一下BigInteger类吧!
一、BigInteger类大数据大都会以字符串的形式传入
BigInteger a = new BigInteger(String val);
二、BigInteger类中的常量
BigInteger zero = BigInteger.ZERO; //0 BigInteger one = BigInteger.ONE; //1 BigInteger ten = BigInteger.TEN; //10
相当于 ==>
BigInteger zero = new BigInteger("0"); BigInteger one = new BigInteger("1"); BigInteger ten = new BigInteger("10");
三、类型转换(int => BigInteger)
int a = 2; BigInteger b = BigInteger.ONE; //方法一: b.add(BigInteger.valueOf(a)); // b+a=1+2=3 //方法二: b.add(new BigInteger(String.valueOf(a))); b.add(new BigInteger(Integer.toString(a)));
在上述类型转换中方法一会更快一点,效率也会更高。方法二中虽然两种都是以创建新的对象的方式来表示,但相较而言String.valueOf() 方法会更快一点
四、BigIntege类中常用的方法
- 加法 ==> add()
- 减法 ==> subtract()
- 乘法 ==> multiply()
- 除法 ==> divide()
- 最大数 ==> max()
- 最小数 ==> min()
- 求余数 ==> remainder()
- 绝对值 ==> abs()
- 相反数 ==> negate()
BigInteger类的基本用法也就以上这些啦。下面来解决 阶乘之和 问题:
以洛谷算法 P1009 [NOIP1998 普及组] 阶乘之和 进行讲解
这个题就需要用到高精度BigInteger类来解决,因为n的范围是 1 ≤ n ≤ 50。
上代码:
import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); BigInteger S = new BigInteger("0"); for (int i = n; i >= 1; i--) { BigInteger a = new BigInteger("1"); //可以换成BigInteger a = BigInteger.ONE; for (int j = 1; j <= i; j++) { a = a.multiply(BigInteger.valueOf(j)); } S = S.add(a); } System.out.println(S); sc.close(); //释放资源 } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
简单编程题目连载(十)——公共最长子序列