洛谷 P1009[NOIP1998 普及组] 阶乘之和 https://www.luogu.com.cn/problem/P1009https://www.luogu.com.cn/problem/P1009
对于这道题目而言,大多数人一定会想到分别用高精度乘法和加法来实现阶乘和求和,这样的话又有些同学会想到要用模块化编程的思路来进行代码的完善——用两个函数来分别实现;
然而,对于这道题还有另一种更加简洁方便的做法——用两个数组来进行实现,其中一个数组求解最新的阶乘,而另一个数组用来存放累加求得的和。
#include <iostream>
using namespace std;
int a[150]; //用来存放答案,进行滚动更新
int b[150]; //用来算最高的阶乘
int main()
{
int n,i;
cin>>n;
a[0]=b[0]=1;
for(i=2;i<=n;i++)
{
for(int j=0;j<=100;j++)
b[j]*=i; //要把这步分出来是因为我们的新数据是要覆盖掉之前的a数组的
for(int j=0;j<=100;j++)
{
b[j+1]+=b[j]/10;
b[j]%=10;
}
for(int j=0;j<=100;j++)
a[j]+=b[j]; //原理同上
for(int j=0;j<=100;j++)
{
a[j+1]+=a[j]/10;
a[j]%=10;
}
}
for(i=100;a[i]==0&&i>0;i--);
for(int j=i;j>=0;j--)
cout<<a[j];
return 0;
}
以上就是我的AC代码了,希望对大家有帮助