题目描述
相信大家都知道美国电影里的FBI,可是大家是否知道意大利数学家斐波那契提出的著名的FIB数列呢,其定义如下:对于正整数数列A[n]有 A[1]=1,A[2]=1,A[n]=A[n-1]+A[n-2],( n>2); 现在你的任务是求出Fibonacci数列的第n项。
输入要求
输入数据由多组数据组成。每组数据一行,仅一个整数,表示n的值。输入为0时结束输入。
输出要求
对于每组数据,输出仅一行,即Fibonacci数列的第n项。 我们保证输出的结果不会超过1000位数。
输入样例
1
2
3
4
5
6
20
0
输出样例
1
1
2
3
5
8
6765
思路分析
大数斐波拉契数列 = 非递归实现斐波拉契数列(防止超时) + 大数相加
AC代码
#include<stdio.h>
#include<string.h>
#define MAX 1200
int num[MAX*2]={0};
char text[MAX*2];
int Max(int a,int b)
{
if(a>b)
return a;
else
return b;
}//返回较大的数
void Sum(char num1[],char num2[])//大数相加
{
int l1,l2,i,max,len,j;
l1 = strlen(num1);l2=strlen(num2);
max=Max(l1,l2);
memset(num,0,MAX*sizeof(int));//清空数据数组(主函数需要多次使用)(*全局变量的缺点*)
for(i = 0,j = l1-1;i < l1 ; i++,j--)
num[j]+=num1[i]-'0';
for(i = 0,j = l2-1; i < l2; i++,j--)
num[j]+=num2[i]-'0';//将两组字符转化相加为int型数组
len=max-1;//数据长度;
for(i = 0;i <= len ; i++)
if(num[i] >= 10)
{
num[i+1] += num[i]/10;
num[i] %= 10;
if(i==len)
len++;
}
for(i = len,j = 0;i >=0;i--,j++)
text[j]=num[i]+'0';//数据数组再次转化为字符型方便直接用puts输出
}
int main()
{
int n,i;
char num1[MAX]={0},num2[MAX]={0},num3[MAX*2]={0};
while(scanf("%d",&n)!=EOF)//多组数据输入
{
num1[0]='1';
num2[0]='1';//赋予初值
if(n==0)
break;
else if(n==1||n==2)
printf("1\n");//第1,2位斐波拉契数
else//大于2
{
for(i = 2;i < n;i++)
{
Sum(num1,num2);//text=num1+num2求合
strcpy(num3,text);
strcpy(num1,num2);
strcpy(num2,num3);//交换非递归实现斐波拉契*/
}
puts(num3);//输出
memset(num1,0,sizeof(char)*MAX);
memset(num2,0,sizeof(char)*MAX);
memset(num3,0,sizeof(char)*MAX);
memset(text,0,sizeof(char)*MAX);//清空上次数据残留
}
}
return 0;
}
总结
对于全局变量的使用,在面对多组数据处理时需要注意对上次的数据进行清零处理,以及在测试多组数据时对不需要重新赋值的数组的清零处理.