I've tried again and again for this problem, and always got WAs.
And I've modified my code several times, check the answer with friends, did something like that all night, but i just can't figure it out why.
I've also tried some different OS, different compiler..just don't know..don't understand..
Or does this problem have some special requirement?
[c]
#include <stdio.h>
long num1[400];
long num2[400];
struct {
long v[400];
int l;
} fibo[5002];
int l=1;
int i=0,j=1,k,maxn;
void plus(long *num1,long *num2,int *l){
int i;
for (i=0;i<*l;i++){
num1[i]=num1[i]+num2[i];
if (num1[i]>=10000) {
if (i == (*l)-1)
(*l)++;
num1[i] %= 10000;
num1[i+1]+=1;
}
}
if (num1[*l+1]!=0) (*l)++;
}
void getfib(int n){
for (i=(maxn/2)+(maxn%2)-1;i<n/2+n%2-1;i++){
plus(num1,num2,&l);
for (k=0;k<l;k++){
fibo[j].v[k]=num1[k];
fibo[j].l=l;
}
j++;
plus(num2,num1,&l);
for (k=0;k<l;k++){
fibo[j].v[k]=num2[k];
fibo[j].l=l;
}
j++;
}
maxn=n;
}
int main(void){
int n;
num1[0]=0;
num2[0]=1;
while (scanf("%d",&n)==1){
if (n>maxn) getfib(n);
printf("The Fibonacci number for %d is ",n);
if (n==0) {printf("0\n");}
else if (n==1) {printf("1\n");}
else{
for (i=fibo[n-1].l-1;i>=0;i--){
if (i!=fibo[n-1].l-1){
if (fibo[n-1].v[i]/1000 == 0){
printf("0");
if (fibo[n-1].v[i]/100 == 0){
printf("0");
if (fibo[n-1].v[i]/10 == 0){
printf("0");
if (fibo[n-1].v[i] == 0){
printf("0");
}
}
}
}
}
if ((i!=fibo[n-1].l-1)||(fibo[n-1].v[fibo[n-1].l-1]!=0)||(i==0)) printf("%ld",fibo[n-1].v[i]);
}
printf("\n");
}
}
return 0;
}
[/c]

