[问题描述]
令S=1!+2!+3!+… + 202320232023!,求s的末尾9位数字。
提示:答案首位不为0。
1. 想法
这么大的数据应该用long类型,然后定义sum用于存储所有计算结果的和,num用于存储每次计算的结果,用for循环。
2. 问题
结果还是栈溢出,数据太大了。然后我就在网上找到了可以储存更大数据的BigInteger。就是计算的操作还得调用相应的方法。
3. 结果
运行了半天都没出结果,没办法看别人题解发现循环中的i根本不用算到三个2023。。。,算到40就能出结果了。
4. 收获
有时候得学聪明些,不能按照题目的来。
BigInteger详解
基本运算
返回值为BigInteger类型:add(),subtract(),multiply(),divide(),mod(),remainder(),pow(),abs(),negate();
//基本运算:add(),subtract(),multiply(),divide(),mod(),remainder(),pow(),abs(),negate()
@Test
public void testBasic() {
BigInteger a = new BigInteger("13");
BigInteger b = new BigInteger("4");
int n = 3;
//1.加
BigInteger bigNum1 = a.add(b); //17
//2.减
BigInteger bigNum2 = a.subtract(b); //9
//3.乘
BigInteger bigNum3 = a.multiply(b); //52
//4.除
BigInteger bigNum4 = a.divide(b); //3
//5.取模(需 b > 0,否则出现异常:ArithmeticException("BigInteger: modulus not positive"))
BigInteger bigNum5 = a.mod(b); //1
//6.求余
BigInteger bigNum6 = a.remainder(b); //1
//7.平方(需 n >= 0,否则出现异常:ArithmeticException("Negative exponent"))
BigInteger bigNum7 = a.pow(n); //2197
//8.取绝对值
BigInteger bigNum8 = a.abs(); //13
//9.取相反数
BigInteger bigNum9 = a.negate(); //-13
}
比较大小
compareTo()返回一个int型数据:1 大于; 0 等于; -1 小于;
max(),min():分别返回大的(小的)那个BigInteger数据;
//比较大小:compareTo(),max(),min()
@Test
public void testCompare() {
BigInteger bigNum1 = new BigInteger("52");
BigInteger bigNum2 = new BigInteger("27");
//1.compareTo():返回一个int型数据(1 大于; 0 等于; -1 小于)
int num = bigNum1.compareTo(bigNum2); //1
//2.max():直接返回大的那个数,类型为BigInteger
// 原理:return (compareTo(val) > 0 ? this : val);
BigInteger compareMax = bigNum1.max(bigNum2); //52
//3.min():直接返回小的那个数,类型为BigInteger
// 原理:return (compareTo(val) < 0 ? this : val);
BigInteger compareMin = bigNum1.min(bigNum2); //27
}
5. 正确代码
public class FactorialSum {
public static void main(String[] args) {
// num用于存储每次计算的结果
BigInteger num = new BigInteger("1");
// sum用于存储所有计算结果的和
BigInteger sum = new BigInteger("0");
for (int i = 1; i < 40; i++) {
num = num.multiply(BigInteger.valueOf(i));
sum = sum.add(num);
}
String sum1 = String.valueOf(sum);
System.out.println(sum1.substring(sum1.length() - 9));
}
}