题目描述
用高精度计算出S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤50)
输入
一个正整数N。
输出
一个正整数S,表示计算结果。
样例输入
3
50
样例输出
9
31035053229546199656252032972759319953190362094566672920420940313
题意解析
就是大数阶乘和大数加法的结合
先算出来阶乘,然后每算出来一次,就加上
代码篇
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int arr[10000] = {0}, a, brr[10000] = {0};
while(cin >> a)
{
int count = 1, count1 = 1; ///count为阶乘数组位数,count1为结果数组位数;
memset(arr, 0, sizeof(arr));
memset(brr, 0, sizeof(brr));
arr[0] = 1;
for(int i = 1; i <= a; i++)
{
///阶乘
for(int j = 0; j < count; j++)
{
arr[j] *= i;
}
for(int j = 0; j < count; j++)
{
if(arr[j] >= 10)
{
arr[j + 1] += arr[j] / 10;
arr[j] %= 10;
}
}
while(arr[count])
{
arr[count + 1] += arr[count] / 10;
arr[count] %= 10;
count++;
}
///plus
count1 = count;
for(int i = 0; i < count; i++)
{
brr[i] += arr[i];
if(brr[i] >= 10)
{
brr[i + 1] += brr[i] / 10;
brr[i] %= 10;
}
}
while(brr[count1])
{
brr[count1 + 1] += brr[count1] / 10;
brr[count1] %= 10;
count1++;
}
}
for(int i = count1 + 1; i >= 0; i--) ///输出
{
if(brr[i] != 0)
{
for(int j = i; j >= 0; j--)
cout << brr[j];
cout << endl;
break;
}
}
}
return 0;
}
OVER!