洛谷 P1009 阶乘之和 Label:高精度

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)

其中“!”表示阶乘,例如:5!=5*4*3*2*1。

输入输出格式

输入格式:

 

一个正整数N。

 

输出格式:

 

一个正整数S,表示计算结果。

 

输入输出样例

输入样例#1:

3

输出样例#1:

9

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,sum[256],a[256];
 7 
 8 void plus_(){
 9     int i=0,k=max(sum[0],a[0]);
10 //    cout<<k<<endl;
11     for(int i=1;i<=k;i++){
12         sum[i+1]+=(sum[i]+a[i])/10;
13         sum[i]=(sum[i]+a[i])%10;
14     }
15     if(sum[k+1]>0) sum[0]=k+1;
16     else sum[0]=k;
17 }
18 
19 void multiply(int key){
20     int i=0,k=a[0];//此处没有考虑k<=0的情况
21     for(i=1;i<=k;i++) a[i]*=key;
22     
23     
24     for(i=1;i<=k;i++){
25         a[i+1]+=a[i]/10;
26         a[i]%=10;
27     }
28     while(a[i]>0){
29         a[i+1]=a[i]/10;
30         a[i]%=10;
31 //        cout<<a[i]<<" ";
32         i++;
33         a[0]++;
34     }
35 }
36 
37 int main(){
38 //    freopen("01.txt","r",stdin);
39     scanf("%d",&n);
40     a[0]=a[1]=1;sum[0]=1;
41     for(int i=1;i<=n;i++){
42         multiply(i);
43         plus_();
44     }
45 /*    for(int i=a[0];i>=1;i--)
46 **        printf("%d",a[i]);
47 **    puts("");
48 */
49     for(int i=sum[0];i>=1;i--)
50         printf("%d",sum[i]);
51     puts("");
52     return 0;
53 }

高精度,因为是阶乘,所以a[1]=1,a[0]=1

 

posted @ 2016-08-24 19:35  Radiumlrb  阅读(264)  评论(0编辑  收藏  举报