看起来超级简单的题,除了那2005位数。。。正好这几天都在做高精度乘法和加法的题,自己写了一个类。
下面是我的AC代码:直接加的话内存会爆,所以我又特地写了一个函数,呵呵。。。7038的原因是strlen(t[7037])==2005.
#includeusing namespace std;const int MAX_LEN=2010;int temp[MAX_LEN];class bigNumber{public: bigNumber() { memset(number,0,sizeof(number)); number[0]='0'; } bigNumber(char *str) { memcpy(number,str,strlen(str)+1); } bigNumber(int a) { int i=0; memset(number,0,sizeof(number)); if(a==0) number[0]='0'; else { while(a) { number[i++]=a%10+'0'; a/=10; } _strrev(number); } } ~bigNumber() { } char* getNumber() { return number; } friend ostream& operator<<(ostream& output, bigNumber& t) { output< getNumber())>strlen(t.getNumber())?this:&t; bigNumber* b=strlen(this->getNumber())>strlen(t.getNumber())?&t:this; bigNumber* c=new bigNumber(); char *x=a->getNumber(); char *y=b->getNumber(); char *z=c->getNumber(); int lenx=strlen(x); int leny=strlen(y); int i; int flag=0; for(i=0;i 9; z[i]=z[i]%10+'0'; } for(;i 9; z[i]=z[i]%10+'0'; } if(flag) z[i]='1'; _strrev(z); return *c; } void addFourNumber(bigNumber& a,bigNumber& b,bigNumber& c,bigNumber& d) { int i,len,lenx,leny,lenp,lenq; int flag=0; char *x=a.getNumber(); char *y=b.getNumber(); char *p=c.getNumber(); char *q=d.getNumber(); char *z=this->getNumber(); lenx=strlen(x); leny=strlen(y); lenp=strlen(p); lenq=strlen(q); len=lenx>leny?lenx:leny; len=lenp>len?lenp:len; len=lenq>len?lenq:len; for(i=0;i getNumber(); char *y=t.getNumber(); char *z=c->getNumber(); int lenx=strlen(x); int leny=strlen(y); int i,j; memset(temp,0,sizeof(temp)); for(i=0;i 9;i++) { if(temp[i]>9) temp[i+1]+=temp[i]/10; z[i]=temp[i]%10+'0'; } z[i]=temp[i]+'0'; while(z[i]=='0') z[i--]=0; _strrev(z); return *c; } bigNumber& operator=(bigNumber& t) { memcpy(number,t.getNumber(),strlen(t.getNumber())+1); return *this; } bigNumber& operator=(char *str) { memcpy(number,str,strlen(str)+1); return *this; }private: char number[MAX_LEN];};bigNumber t[7038]={ 1,1,1,1,1};int main(){ int i; for(i=5;i<7038;i++) t[i].addFourNumber(t[i-1],t[i-2],t[i-3],t[i-4]); while(cin>>i) cout< <