【高精度】阶乘和

时间:2022-01-19 03:37:00

问题 I: 【高精度】阶乘和

时间限制: 1 Sec  内存限制: 64 MB
提交: 4  解决: 4
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

已知正整数N(N≤200),设S=1!+2!+3!+…N!,其中“!”表示阶乘,即N!=1×2×3×…×(N-l)×N,如:3 1=1×2×3…6。请编程实现:输入正整数N,计算结果S的值。

 

输入

一个正整数N(N≤200)。

 

输出

阶乘和。

 

样例输入

4

 

样例输出

33

高精度加法与高精度阶乘结合
【高精度】阶乘和【高精度】阶乘和
 1 #include <iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int nn,a[100005],b[100005];
 7 string fun_plus(string s,string t)
 8 {
 9     string res;
10     int len_s=s.size(),len_t=t.size();
11     int len=max(len_s,len_t);
12     memset(a,0,sizeof(a));
13     memset(b,0,sizeof(b));
14     for(int i=len_s-1;i>=0;i--) a[len_s-i-1]=s[i]-'0';
15     for(int i=len_t-1;i>=0;i--) b[len_t-i-1]=t[i]-'0';
16     for(int i=0;i<len;i++)
17     {
18         a[i]+=b[i];
19         a[i+1]+=a[i]/10;
20         a[i]%=10;
21     }
22     while(a[len]==0)    len--;
23     for(int i=len;i>=0;i--)   res+=a[i]+'0';
24     return res;
25 }
26 string fun_multi(int n)
27 {
28     string res;
29     if(n==0)    return "1";
30     memset(a,0,sizeof(a));
31     int cnt=0,m=n;
32     while(m)    a[cnt++]=m%10,m/=10;
33     for(int i=n-1;i>=2;i--)
34     {
35         int w=0;
36         for(int j=0;j<cnt;j++)
37         {
38             a[j]=a[j]*i+w;
39             w=a[j]/10;//此处顺序不能改变
40             a[j]%=10;
41         }
42         while(w)
43         {
44             a[cnt++]=w%10;
45             w/=10;
46         }
47     }
48     while(!a[cnt])  cnt--;
49     for(int i=cnt;i>=0;i--)
50         res+=a[i]+'0';
51     return res;
52 }
53 int main()
54 {
55     cin>>nn;
56     string ans,temp;
57     for(int i=1;i<=nn;i++)
58     {
59         temp=fun_multi(i);
60         ans=fun_plus(temp,ans);
61     }
62     cout<<ans<<endl;
63     return 0;
64 }
View Code