计算N!,其中0<=N<=10000。没有太多,就是个裸的大数问题。写下了有个大数模板以供使用。
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
class big_number{
public:
int len;
char num[41000];
big_number(){
len=1;
for(int i=0;i<40101;++i) this->num[i]='0';
}
big_number(int len,char str[]){
this->len=len;
for(int i=0;i<40101;++i) this->num[i]='0';
for(int i=0;i<len;++i) this->num[len-1-i]=str[i];
}
big_number operator +(const big_number& a){
big_number ans;
int L=max(this->len,a.len);
int carry=0;
for(int i=0;i<L;++i){
carry=a.num[i]-'0'+this->num[i]-'0'+carry;
ans.num[i]=carry%10+'0';
carry=carry/10;
}
if(carry==0) ans.len=L;
else{
ans.len=L+1;
ans.num[L]=carry+'0';
}
return ans;
}
big_number operator +(int a){
big_number ans;
int i=0;
while(a){
a=a+this->num[i]-'0';
ans.num[i]=a%10+'0';
a=a/10;
i++;
}
while(i<this->len) {
ans.num[i]=this->num[i];
i++;
}
ans.len=i;
return ans;
}
big_number operator *(const big_number& a){
big_number ans;
big_number temp;
for(int i=0;i<this->len;++i){
int mul=this->num[i];
int carry=0;
for(int j=0;j<a.len;++j){
int temp_num=mul*(a.num[j]-'0')+carry;
temp.num[j+i]=temp_num%10+'0';
carry=temp_num/10;
}
if(carry==0) temp.len=a.len+i;
else {
temp.len=a.len+1+i;
temp.num[a.len+i]=carry+'0';
}
ans=ans+temp;
}
return ans;
}
big_number operator *(int a){
big_number temp;
int carry=0;
for(int j=0;j<this->len;++j){
carry=carry+(this->num[j]-'0')*a;
temp.num[j]=carry%10+'0';
carry=carry/10;
}
if(carry==0) temp.len=this->len;
else{
int i=0;
while(carry){
temp.num[this->len+i]=carry%10+'0';
carry=carry/10;
i++;
}
temp.len=this->len+i;
}
return temp;
}
};
big_number ans[1010];
big_number fin;
int main(){
int n;
ans[0].len=1,ans[0].num[0]='1';
for(int i=1;i<1001;++i){
ans[i]=ans[i-1];
for(int j=(i-1)*10+1;j<=i*10;++j)
ans[i]=ans[i]*j;
}
while(scanf("%d",&n)!=EOF){
fin=ans[n/10];
int l=n%10;
for(int i=1;i<=l;++i)
fin=fin*(n-l+i);
for(int i=fin.len-1;i>=0;--i)
printf("%c",fin.num[i]);
printf("\n");
}
return 0;
}