问题描述
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*n。
其中n!=1*2*3*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!的准确值。
样例输入
10
样例输出
3628800
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <deque> #include <cmath> #include <map> using namespace std; typedef long long ll; #define INF 0x7fffffff const double inf=1e20; const int maxn=1e6+10; const int mod=1e7; const double pi=acos(-1); ll a[maxn],m; ll num0; void f(ll n){ for(int i=1;i<=n;i++){ //printf("%d\n",i); ll sum=0; ll ii=i; while(ii%10==0){ num0++; ii/=10; } for(int j=0;j<m;j++){ a[j]*=ii; a[j]+=sum; sum=a[j]/mod; a[j]%=mod; } if(sum!=0){ a[m]=sum; m++; } } } int main(){ ll n; scanf("%lld",&n); num0=0; m=1; a[0]=1; f(n); for(int i=m-1;i>=0;i--){ if(i==m-1)printf("%lld",a[i]); else printf("%07lld",a[i]); } for(int i=0;i<num0;i++){ printf("0"); } printf("\n"); return 0; }