记录编号 |
548957 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 1998]阶乘之和 |
最终得分 |
100 |
用户昵称 |
锝镆氪锂铽 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.000 s |
提交时间 |
2020-02-03 18:10:26 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
void multi(int sum[],int x);
void print(int a[]);
void add(int a[],int b[],int c[]);
void clone(int a[],int b[]);
int fa(){
freopen("factoriall.in","r",stdin);
freopen("factoriall.out","w",stdout);
int sum[40000],a[40000],b[40000],n,j=1;
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(a,0,sizeof(a));
while(j<=n){
memset(sum,0,sizeof(sum));
sum[1]=1;sum[0]=1;
for(int i=1;i<=j;i++){
multi(sum,i);
}
add(sum,a,b);
clone(b,a);
j++;
}
print(b);
return 0;
}
int lol=fa();
int main(void){;}
void multi(int sum[],int x){
int res=0;//进阶
for(int i=1; i<=sum[0]; ++i)
{
int temp=sum[i]*x+res;
sum[i]=temp%10;
res=temp/10;
}
while(res)
{
sum[++sum[0]]=res%10;
res/=10;
}
}
void print(int a[]){
for(int i=a[0];i>=1;i--){
printf("%d",a[i]);
}
printf("\n");
}
void add(int a[],int b[],int c[])
{
int carry=0,cur=1;
while(cur<=a[0]||cur<=b[0])
{
c[cur]=(a[cur]+b[cur]+carry)%10;
carry=(a[cur]+b[cur]+carry)/10;
++cur;
}
c[cur]=carry;
if(c[cur]==0)--cur;
c[0] = cur;
}
void clone(int a[],int b[]){
for(int i=0;i<=a[0];i++){
b[i]=a[i];
}
}