AcWing 3389. N 的阶乘
原题链接
简单
//n很大 1000 不能直接算,会爆int,int 范围:(2^31-1)
//如果long long (2^63-1)大概20位
//而1000的阶乘大概1000位,用到高精度算法
//当int longlong double 都存不下 就想办法用高精度来存
//高精度一般用数组来存
//如果要存1000位的数,则开一个长度为1000的数组
//用a[0]表示个位,a[1]表示十位 倒着存 因为如果做加法,需要进位,如果加1位的话,直接在数组最后加
//如果a : 0 1 想加一个的话直接在后面加1 就相当于百位加1了
//如果存: 1234567
//在数组中:7654321
//算n!=(n-1)!*n n是1000,而n-1阶乘有1000位,所以是一个高精度的数乘低精度(int)的数
//高精度乘法
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1010;
vector<int> F[N]; //答案
vector<int> mul(vector<int>& A, int b)
{
vector<int> C;
for (int i = 0, t = 0; i < A.size() || t; i ++ )
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
int main()
{
int n;
F[0] = {1};
for (int i = 1; i <= 1000; i ++ ) F[i] = mul(F[i - 1], i);
while (cin >> n)
{
for (int i = F[n].size() - 1; i >= 0; i -- )
cout << F[n][i];
cout << endl;
}
return 0;
}