清华大学的机试题,求N!(1<=n<=1000)
其实是一个大数和一个小于等于4位的int相乘
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; struct BigInteger { int num[1000]; int size; BigInteger() { memset(num,0,sizeof(num)); size=0; } BigInteger(char str[]) { memset(num,0,sizeof(num)); size=0; int len=strlen(str); int j=0,w=1,tmp=0; for(int i=len-1; i>=0; i--) { tmp+=w*(str[i]-‘0‘); j++; w*=10; if(j==4||i==0) { num[size++]=tmp; tmp=j=0; w=1; } } } BigInteger operator +(const BigInteger &a)const { BigInteger res; int up=0; for(int i=0; i<size||i<a.size; i++) { int tmp=num[i]+a.num[i]+up; up=tmp/10000; tmp=tmp%10000; res.num[i]=tmp; res.size++; } if(up) res.num[res.size++]=up; return res; } BigInteger operator *(int x)const { BigInteger res; int up=0,tmp=0; for(int i=0; i<size; i++) { tmp=num[i]*x+up; up=tmp/10000; tmp=tmp%10000; res.num[res.size++]=tmp; } if(up) res.num[res.size++]=up; return res; } void print() { for(int i=size-1; i>=0; i--) { if(i==size-1) printf("%d",num[i]); else printf("%04d",num[i]); } printf("\n"); } }; int main() { int n; while(scanf("%d",&n)!=EOF) { char a[5]; BigInteger res("1"); for(int i=2; i<=n; i++) { res=res*i; } res.print(); } return 0; }