欢迎来到就算过了一载春秋的博客

不管过了几载春秋,我还是会偶尔想起。

【洛谷】P1009 阶乘之和

题目链接

题目描述

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

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

输入输出格式

输入格式:

一个正整数 N 。

输出格式:

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

输入输出样例

输入样例#1: 复制

3

输出样例#1: 复制

9

简单的大数相加和大数相乘。

AC代码:

 1 #include<iostream>
 2 #include<sstream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<iomanip>
 6 #include<vector>
 7 #include<cmath>
 8 #include<stack>
 9 using namespace std;
10 string lan_add(string a,string b)//large number addition
11 {
12     int la=a.length(),lb=b.length();
13     //将字符串中字符转化为数字并倒序存储 
14     int l=max(la,lb)+1,num1[l],num2[l];
15     memset(num1,0,sizeof(num1));
16     memset(num2,0,sizeof(num2));
17     for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0';
18     for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0';
19     //la长度的数与lb长度的数之和长度不会超过max(la+lb)+1 ,模拟加法
20     int c[l]={0};
21     for(int i=0;i<l;i++)   c[i]=num1[i]+num2[i];
22     //处理进位
23     int carry=0;
24     for(int i=0;i<l;i++)
25     {
26         c[i]+=carry;
27         carry=c[i]/10;
28         c[i]%=10;
29     }    
30 
31     string ans;
32     for(int i=l-1;i>=0;i--)  ans+=c[i]+'0';
33         while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0  
34     return ans;
35 }
36 string lan_mul(string a,string b)//large number multiplication
37 {
38     int la=a.length(),lb=b.length();
39     //将字符串中字符转化为数字并倒序存储 
40     int num1[la],num2[lb];
41     for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0';
42     for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0';
43     //la长度的数和lb长度的数乘积长度不会超过la+lb ,模拟乘法 
44     int c[la+lb]={0};
45     for(int i=0;i<la;i++)
46     for(int j=0;j<lb;j++)
47     c[i+j]+=num1[i]*num2[j];
48     //处理进位
49     int carry=0;
50     for(int i=0;i<la+lb;i++)
51     {
52         c[i]+=carry;
53         carry=c[i]/10;
54         c[i]%=10;
55     }    
56     
57     string ans;
58     for(int i=la+lb-1;i>=0;i--)
59     ans+=c[i]+'0';
60     while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0  
61     return ans;
62 }
63 string to_str(int n)//将整数转化为字符串 
64 {
65     string ans;
66     stringstream ss;
67     ss<<n;
68     ss>>ans;
69     return ans;
70 }
71 int main()
72 {
73     int N;cin>>N;
74     string result="0",temp="1";
75         for(int i=1;i<=N;i++)
76         {
77         temp=lan_mul(temp,to_str(i));
78         result=lan_add(result,temp);
79     }
80     cout<<result;
81 }
View Code

posted on 2018-08-26 17:02  就算过了一载春秋  阅读(180)  评论(0)    收藏  举报

导航