Fibonacci数列问题 求解 谢谢了~没分可加了 。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fibonacci数列问题 求解 谢谢了~没分可加了 。。相关的知识,希望对你有一定的参考价值。

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 数。
注意是高精度高手些不要用C++编啊 要 C。。
谢谢了
谢谢你的回答 但是不是我要的答案 你这个答案是非高精度算法的 ~~
因为TC是16位系统 整数表示的范围不够,
long 也不够的 这个数列的第100项就已经超过LONG 了 DOUBLE 也不行的

最后一楼格式不对:给个参考用例吧
测试输入:
2
9
1234567890
测试输出:
8
1134903170

帮你改了一下,测试没有问题
-----------------------------------------------------------------------------
/*
* fib.c
*/
#include <stdio.h>
#define MAX_NUM 100

char a[MAX_NUM];
char b[MAX_NUM];
char c[MAX_NUM];

/*计算第N项*/
char *fibonacci(unsigned long N)

unsigned long i;
int k,tmp,flag;
memset(a,0,MAX_NUM);
memset(b,0,MAX_NUM);
memset(c,0,MAX_NUM);
a[0]=1;
b[0]=1;
c[0]=1;

if(N<3) return c;

for(i=3;i<=N;i++)

k=0;
flag=0;
while(k<MAX_NUM)

tmp = a[k]+b[k]+flag;
c[k] =tmp%10;
flag =tmp/10;
k++;

memcpy(a,b,MAX_NUM);
memcpy(b,c,MAX_NUM);

return c;

/*比较两个数的大小*/
int CompareFibonacci(char *f1, char *f2)

char tmp[MAX_NUM];
int i=0,t,flag=0;
int flag0=0;

while(i<MAX_NUM)

t=f1[i]-f2[i]-flag;
if(t<0)

t += 10;
flag =1;

else flag=0;
if(t!=0&&flag0==0) flag0=1;
tmp[i++]=t;

if (flag) return -1;
if (flag0) return 1;
return 0;

void main()

int count,i=0,j=0,k=0,kk;
unsigned long N=1;
char d[100][MAX_NUM];
char e[MAX_NUM];
printf("First row is the count:");
scanf("%d", &count);
do

printf("input a integer or 'end' to finished:");
scanf("%s",d[i]);
while(i<count-1 && d[i++][0]!='e');

printf("Output:\n");
for(j=0;j<=i;j++)

memset(e,0,MAX_NUM);
k=MAX_NUM-1;
while(d[j][k]==0) k--;
kk=0;
while(k>=0)e[kk++]=d[j][k--]-'0';

/*计算比给定数大的Fibonacci数*/
N=1;
do

fibonacci(N++);
while(CompareFibonacci(e,c)>0);

/*输出a[]就是所求*/
k=MAX_NUM-1;
while(a[k]==0)k--;
while(k>=0) printf("%d",a[k--]);
printf("\n");


printf("\nPress any key to exit.\n");
getch();
参考技术A 函数 fun()如下:

int fun(int n)

if(n==1||n==2)

return 1;

else if(n>=3)

return fun(n-1)+fun(n-2);

else

return 0;



补充:
哦,明白了,原来是这样
那么你可以把上面的int,全部修改为long啊
参考技术B 函数 fun()如下:

int fun(int n)

if(n==1||n==2)

return 1;

else if(n>=3)

return fun(n-1)+fun(n-2);

else

return 0;

参考技术C 不行的,这个数太大了:101000

如果要高精度,只有把数字分段保存在数组中。

以上是关于Fibonacci数列问题 求解 谢谢了~没分可加了 。。的主要内容,如果未能解决你的问题,请参考以下文章

Fibonacci数列问题

编程之美斐波那契(Fibonacci)数列

你真的懂斐波那契数列吗?Fibonacci四种解法满足你!

c问题,fibonacci数列.

斐波那契Fibonacci数列的通项公式

常用算法——Fibonacci数列问题