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数列问题 求解 谢谢了~没分可加了 。。的主要内容,如果未能解决你的问题,请参考以下文章