废了一下午搞出来的一个高精度题,自己真的太笨了
题目链接: https://www.luogu.com.cn/problem/P1009
题目大意:
题目描述
用高精度计算出 S=1!+2!+3!+⋯+n!S = 1! + 2! + 3! + \cdots + n!S=1!+2!+3!+⋯+n!(n≤50n \le 50n≤50)。
其中“!”表示阶乘,例如:5!=5×4×3×2×15! = 5 \times 4 \times 3 \times 2 \times 15!=5×4×3×2×1。
输入格式
一个正整数 nnn。
输出格式
一个正整数 SSS,表示计算结果。
输入输出样例
输入 #1
3
输出 #1
9
说明/提示
【数据范围】
对于 100%100 \%100% 的数据,1≤n≤501 \le n \le 501≤n≤50。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n≤20n \le 20n≤20,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。
首先你要知道高精度的基本运算(加减乘除)
不会就去这里: https://oi-wiki.org/math/bignum/#_4
代码展示
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int LEN=1000; 4 void clear(int a[]){ 5 for(int i=0;i<LEN;i++){ 6 a[i]=0; 7 } 8 } 9 void mul(int a[], int b, int c[]) { 10 clear(c); 11 for (int i = 0; i < LEN - 1; ++i) { 12 // 直接把 a 的第 i 位数码乘以乘数,加入结果 13 c[i] += a[i] * b; 14 15 if (c[i] >= 10) { 16 // 处理进位 17 // c[i] / 10 即除法的商数成为进位的增量值 18 c[i + 1] += c[i] / 10; 19 // 而 c[i] % 10 即除法的余数成为在当前位留下的值 20 c[i] %= 10; 21 } 22 } 23 } 24 void print(int a[]){ 25 int i; 26 for(i=LEN-1;i>=1;i--){ 27 if(a[i]!=0){ 28 break; 29 } 30 } 31 for(int j=i;j>=0;j--){ 32 cout<<a[j]; 33 } 34 cout<<endl; 35 } 36 void copy(int a[],int b[]){ 37 clear(a); 38 for(int i=0;i<LEN;i++){ 39 a[i]=b[i]; 40 } 41 } 42 void add(int a[],int b[],int c[]){ 43 clear(c); 44 for(int i=0;i<LEN;i++){ 45 c[i]+=a[i]+b[i]; 46 if(c[i]>=10){ 47 c[i+1]++; 48 c[i]-=10; 49 } 50 } 51 } 52 int a[LEN]={0}; 53 int b[LEN]={0}; 54 int c[LEN]={0}; 55 int ans[LEN]={0}; 56 int t[LEN]={0}; 57 int main(){ 58 int n; 59 cin>>n; 60 a[0]=1; 61 for(int i=1;i<=n;i++){ 62 mul(a,i,c); 63 copy(a,c); 64 copy(b,ans); 65 add(c,b,ans); 66 // print(ans); 67 } 68 // cout<<endl; 69 print(ans); 70 system("pause"); 71 return 0; 72 }
希望这篇博客对你有帮助

浙公网安备 33010602011771号