題目描述
用高精度計(jì)算出S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤50)
其中“!”表示階乘力九,例如:5!=5 \times 4 \times 3 \times 2 \times 15!=5×4×3×2×1。
輸入輸出格式
輸入格式:
一個(gè)正整數(shù)NN管闷。
輸出格式:
一個(gè)正整數(shù)SS,表示計(jì)算結(jié)果。
分析
當(dāng)n = 50時(shí),結(jié)果為:
31035053229546199656252032972759319953190362094566672920420940313
沒(méi)有一個(gè)適當(dāng)?shù)念愋涂梢匀菁{這么長(zhǎng)的一串?dāng)?shù)字幸冻,按正常的思路做,會(huì)導(dǎo)致溢出的異常辩越,可以考慮將結(jié)果垵位保存到數(shù)組中,然后垵位輸出信粮。
思路:見(jiàn)圖
代碼
#include <iostream>
#include <string.h>
using namespace std;
int ans[5001];
int arr[5001] = {1};
int maxLen = 1;
void factorial(int n){
int len = maxLen;
if(n == 1) arr[0] = 1;
//first calculate by bit
for(int j = 0; j < len; j++){
arr[j] *= n;
}
//整理
for(int j = 0; j < len; j++){
if(arr[j] / 10 != 0){
arr[j+1] += arr[j] / 10;
if(j == len - 1){
len++;
if(len > maxLen) maxLen = len;
}
}
arr[j] = arr[j] % 10;
}
}
int main(int argc, const char * argv[]) {
// insert code here...
// std::cout << "Hello, World!\n";
int n = 1;
cin>>n;
for(int i = 1; i <= n; i++){
factorial(i);
for(int j = 0; j < maxLen; j++){
ans[j] += arr[j];
if(ans[j] / 10 != 0){
ans[j+1] += ans[j] / 10;
ans[j] = ans[j] % 10;
if(j == maxLen - 1){
maxLen++;
}
}
}
}
for(int j = maxLen - 1; j >= 0; j--){
cout << ans[j];
}
return 0;
}