运算次数较少的 fibonacci 数列算法,可惜用了乘法

cxjddd 2003-12-30 01:15:52
这是这样想的,fibonacci 数列也可以转换一下:
a b a+b (a+b)+b (a+b+b)+(a+b) ...
也就是说,后面的所有的数都可以用 a * m + b * n 来表示。

程序如下:

int
fib (int n)
{
if (n <= 2)
return 1;

static const int t[8][2] = {{1, 1}, {1, 2}, {2, 3}, {3, 5},
{5, 8}, {8, 13}, {13, 21}, {21, 34}};
int a = 1;
int b = 1;
int m = (n - 3) / 8;
while (m > 0)
{
int temp = a * t[6][0] + b * t[6][1];
b = a * t[7][0] + b * t[7][1];
a = temp;
m--;
}
m = (n - 3) % 8;
b = a * t[m][0] + b * t[m][1];
return b;
}
...全文
54 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lincony 2003-12-30
  • 打赏
  • 举报
回复
我上面的分析有错。
其实,楼主把fibonacci的累加变成了累乘,其结果应该没错。计算速度可能还没有累加快。
lincony 2003-12-30
  • 打赏
  • 举报
回复
其实,楼主只是拿基本的fibonacci数列{{1, 1}, {1, 2}, {2, 3}, {3, 5}, {5, 8}, {8, 13}, {13, 21}, {21, 34}}乘以两个系数a,b得到其他fibonacci数列而已。
如果楼主的程序没有定义static const int t[8][2],还得按fibaoncci的规律来算。int fib (int n)中,如果n >= 11, 程序就要出错了。
楼主这种做法,并不是快速算法,还不如直接利用fibonacci规律,直接用加法计算来得快。
zalyer 2003-12-30
  • 打赏
  • 举报
回复
好像不错
cxjddd 2003-12-30
  • 打赏
  • 举报
回复
如果乘法的时间很长的话,那么就会慢很多。

还好,我这里简单测试了一下,乘法的时间大概是加法的两倍吧。
cxjddd 2003-12-30
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int
fib (int n)
{
if (n <= 2)
return 1;

static const int t[8][2] = {{1, 1}, {1, 2}, {2, 3}, {3, 5},
{5, 8}, {8, 13}, {13, 21}, {21, 34}};
int a = 1;
int b = 1;
int m = (n - 3) / 8;
for (; m > 0; m--)
{
int temp = a * 13 + b * 21;
b = a * 21 + b * 34;
a = temp;
}
m = (n - 3) % 8;
b = a * t[m][0] + b * t[m][1];
return b;
}

int
fib2 (int n)
{
int a = 1;
int b = 1;
for (int i = 3; i <= n; i+=2)
{
a += b;
b += a;
}
return (n & 0x1) ? a : b;
}

int
main ()
{
clock_t t1, t2;
t1 = clock ();
for (int i = 1; i <= 200000; i++)
fib (i);
t2 = clock ();
cout << t2 - t1 << endl;
t1 = clock ();
for (int i = 1; i <= 200000; i++)
fib2 (i);
t2 = clock ();
cout << t2 - t1 << endl;
system ("Pause");
return 0;
}

在 Dev-C++ 里运行,优化后时间比例大概是 1:1 吧。
用 16 个一组的话,可以省一半时间吧。

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧