題目描述
用高精度計算出?S=1!+2!+3!+?+n!(n≤50)。
其中?!
?表示階乘,定義為?n!=n×(n?1)×(n?2)×?×1。例如,5!=5×4×3×2×1=120。
輸入格式
一個正整數?n。
輸出格式
一個正整數?S,表示計算結果。
輸入輸出樣例
輸入?
3
輸出?
9
說明/提示
【數據范圍】
對于?100%?的數據,1≤n≤50。
代碼
無注釋版
#include<bits/stdc++.h>
using namespace std;
const int m=110;
int a[110],b[110];
int main(){int n;cin>>n;a[0]=b[0]=1;for(int i=2;i<=n;i++){for(int j=0;j<m;j++){b[j]*=i;}for(int j=0;j<m;j++){if(b[j]>9){b[j+1]+=b[j]/10;b[j]%=10;}}for(int j=0;j<m;j++){a[j]+=b[j];if(a[j]>9){a[j+1]+=a[j]/10;a[j]%=10;}}}int k=m;for(k=m;k>0&&a[k]==0;k--);for(int i=k;i>=0;i--){cout<<a[i];}}
有注釋版
#include<bits/stdc++.h>
using namespace std;const int m = 110; // 定義一個常量m,表示數組的大小,用于存儲結果int a[110], b[110]; // a數組用來存儲最終結果,b數組用來存儲每次計算階乘的結果int main(){b數組用來存儲每次計算階乘的結果int main(){int n;cin >> n; // 輸入n,表示我們要求1! + 2! + ... + n!a[0] = b[0] = 1; // 初始化a和b數組的第一個元素為1// 從2!開始計算,到n!for(int i = 2; i <= n; i++){// 計算i!,存儲到b數組中for(int j = 0; j < m; j++){b[j] *= i;}// 處理b數組中因乘法導致的進位for(int j = 0; j < m; j++){if(b[j] > 9){ // 如果b[j]大于9,說明需要進位b[j+1] += b[j] / 10; // 將進位加到b[j+1]上b[j] %= 10; // b[j]保留個位數}}// 將b數組的結果加到a數組中(加上當前階乘值)for(int j = 0; j < m; j++){a[j] += b[j]; // a[j] += b[j]表示累加每個階乘的結果if(a[j] > 9){ // 處理進位a[j+1] += a[j] / 10; // 將進位加到a[j+1]上a[j] %= 10; // a[j]保留個位數}}}// 找到a數組中有效數字的最后一個位置int k = m;for(k = m; k > 0 && a[k] == 0; k--); // 從最后一個元素開始向前查找,找到第一個不為0的元素// 輸出結果for(int i = k; i >= 0; i--){cout << a[i]; // 從高位到低位輸出a數組的數字}
}