洛谷 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
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!