您的位置:首页 > 其它

Fibonacci数列问题

2011-07-09 10:06 232 查看
 

12.Fibonacci数列问题

成绩: 10 / 折扣: 0.8
Fibonacci 数列有如下特点:其第 1 , 2 项均为 1 , 1 。从第 3 个数开始,该数是其前两个数之和 . 即 :

F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n>=3)
请你编写一个函数 fun ,它的功能是:对于一个给定的 数( N ), 求不大于 N 的最大 Fibonacci 数。
输入
输入的第一行是一个正整数,表示下面有几组数据需要计算。之后的每一行是一个数据 N ,其中 1 < N <= 101000 。
输出
对应输入的每一行,输出一个 不大于 N 的最大 Fibonacci 数。
 #include<stdio.h>
#include<string.h>
long int comprise(char w1[],char w2[]);
void rever(char s[]);
void cal(char s1[],char s2[],char num[]);

main()
{ long int n,i,j,t,flag;
char num[5000][1002],s1[1002],s2[1002],a[1002];

scanf("%ld",&n);
getchar();
t=1;
for(i=0;i<5000;i++)
for(j=0;j<1002;j++)
num[i][j]='0';
strcpy(num[0],"1");
strcpy(num[1],"1");
for(i=0;i<n;i++)
{ for(j=0;j<1002;j++)
{s1[j]=s2[j]='0';}
gets(a);
flag=1;
for(j=0;j<t;j++)
{ if(comprise(a,num[j])>=0&&comprise(a,num[j+1])<0)
{ printf("%s\n",num[j]);
break;
}
}
if(j<t)
continue;
else
{ strcpy(s1,num[t-1]);
strcpy(s2,num[t]);
}
while(flag)
{ rever(s1);
rever(s2);
cal(s1,s2,num[++t]);
rever(num[t]);
if(comprise(a,num[t-1])>=0&&comprise(a,num[t])<0)
{ printf("%s\n",num[t-1]);
flag=0;
}
else
{ strcpy(s1,num[t-1]);
strcpy(s2,num[t]);
}
}
}
return 0;

}

long int comprise(char w1[],char w2[])
{ long int l1,l2,i;
l1=strlen(w1);
l2=strlen(w2);
if(l1>=l2)
{ if(l1>l2)
return 1;
else
{ for(i=0;i<l1;i++)
if(w1[i]!=w2[i])
return w1[i]-w2[i];
}
}
else
return -1;

}

void rever(char s[])
{ long int k,longth;
char c;
longth=strlen(s);
for(k=0;k<longth/2;k++)
{ c=s[k];
s[k]=s[longth-k-1];
s[longth-k-1]=c;
}
}

void cal(char s1[],char s2[],char num[])
{ long int l1,l2,l,i;
l1=strlen(s1);
l2=strlen(s2);
if(l1>l2)
l=l1;
else
l=l2;
s1[l1]='0';
s2[l2]='0';
for(i=0;i<l;i++)
{
if(num[i]-'0'+s1[i]-'0'+s2[i]-'0'>9)
{ num[i]=num[i]-'0'+s1[i]-'0'+s2[i]-'0'-10+'0';
num[i+1]+=1;
}
else
num[i]=num[i]-'0'+s1[i]-'0'+s2[i]-'0'+'0';
}
if(num[i]!='0')
{ num[i+1]='\0';}
else
num[i]='\0';
s1[l1]='\0';
s2[l2]='\0';
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: