1、题目
2、问题
首先下面想到的是用递归的方式求阶乘
public class Main {
public static void main(String[] args) {
long S=0;
for (long i = 1; i <= 202320232023L; i++) {
S += f(i);
}
System.out.println(S % 1000000000L);
}
public static long f(long n) {
if (n == 1) {
return 1;
} else {
return f(n - 1) * n;
}
}
}
然后就报错了
查了发现是因为递归循环调用次数过多,执行了大量的方法,导致线程栈空间耗尽。
3、代码
public class Main {
public static void main(String[] args) {
long n=202320232023L;
long S=0;
long m=1000000000L;
long s;
for (long i = 1; i <=n; i++) {
s = 1;
for (long j = 1; j <= i; j++) {
s =( s * j)%m;
}
S = S + s;
System.out.println("i:"+i+" "+"S:"+S%m);
}
}
}
直接输出最后的结果就出不来
通过观察得出结果420940313
4、最终代码
找同学帮忙才写出来
public class Main {
public static void main(String[] args) {
long n = 202320232023L;
long m = 1000000000L;
long b = 1;
long S = 0;
for (long i = 1; i <= n; i++) {
// 计算第i项的阶乘,并取余c
b = (b * i) % m;
// 对结果进行判断
if (b == 0) {
// 输出结果
System.out.println(S);
return;
} else {
S = (S % m + b % m) % m;
}
}
}
}
思维受限