N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 86335 Accepted Submission(s): 25398
Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 2 6
Author
JGShining(极光炫影)
Recommend
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int n;
struct BigInt
{
const static int Mod = 10000;
const static int LEN = 4;
int a[N], len;
BigInt(){
memset(a, 0, sizeof a);
len = 1;
}
void init(int x){
memset(a, 0, sizeof a);
len = 0;
do{
a[len++] = x%Mod;
x /= Mod;
}while(x);
}
int Compare(const BigInt &b){ /// a>b 1, a=b 0, a<b -1
if(len < b.len) return -1;
if(len > b.len) return 1;
for(int i = len-1; i >= 0; i--)
if(a[i] < b.a[i])return -1;
else if(a[i] > b.a[i])return 1;
return 0;
}
BigInt operator +(const BigInt &b)const{
BigInt ans;
ans.len = max(len, b.len);
for(int i = 0; i <= ans.len; i++) ans.a[i] = 0;
for(int i = 0; i< ans.len; i++){
ans.a[i] += ((i < len) ? a[i] : 0)+((i < b.len) ? b.a[i] : 0);
ans.a[i+1] += ans.a[i]/Mod;
ans.a[i] %= Mod;
}
if(ans.a[ans.len] > 0)ans.len++;
return ans;
}
BigInt operator -(const BigInt &b)const{
BigInt ans;
ans.len = len;
int k = 0;
for(int i = 0; i < ans.len; i++){
ans.a[i] = a[i]+k-b.a[i];
if(ans.a[i] < 0) ans.a[i] += Mod,k = -1;
else k = 0;
}
while(ans.a[ans.len-1] == 0 && ans.len > 1) ans.len--;
return ans;
}
BigInt operator *(const BigInt &b)const{
BigInt ans;
for(int i = 0; i < len;i++){
int k = 0;
for(int j = 0; j < b.len; j++){
int temp = a[i]*b.a[j]+ans.a[i+j]+k;
ans.a[i+j] = temp%Mod;
k = temp/Mod;
}
if(k != 0) ans.a[i+b.len] = k;
}
ans.len = len+b.len;
while(ans.a[ans.len-1] == 0 && ans.len > 1)ans.len--;
return ans;
}
void output(){
printf("%d", a[len-1]);
for(int i = len-2; i >= 0; i--)
printf("%04d", a[i]);
printf("\n");
}
};
int main(){
while(scanf("%d", &n) == 1){
BigInt ans, x;
ans.init(1);
for(int i = 2;i <= n; i++){
x.init(i);
ans = ans*x;
}
ans.output();
}
}