水题-大数斐波拉契数列【Fibonacci数列 OJ1011】

题目描述

相信大家都知道美国电影里的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;
}

 

总结

对于全局变量的使用,在面对多组数据处理时需要注意对上次的数据进行清零处理,以及在测试多组数据时对不需要重新赋值的数组的清零处理.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值