网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月06日漏签0天
c语言吧 关注:798,833贴子:4,356,078
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 28回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

Finding The Fibonacci Number(logn)

  • 只看楼主
  • 收藏

  • 回复
  • Leeroy
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <stdio.h>

int buf[1000] = {0, 1, 1};

typedef struct
{
    int a;
    int b;
}intPair;

intPair devideIndex(int index)
{
    intPair temp;
    if (index & 1)
    {
        temp.a = index / 2;
        temp.b = index / 2 + 1;
        return temp;
    }
    else
    {
        temp.a = index / 2;
        temp.b = index / 2;
        return temp;
    }
}

int Fibonacci(int n)
{
    intPair p;
    if (buf[n])
        return buf[n];
    p = devideIndex(n);
    return buf[n] = Fibonacci(p.a) * Fibonacci(p.b - 1) + Fibonacci(p.a + 1) * Fibonacci(p.b);
}

int main()
{
    int i;
    for (i = 1; i <= 20; ++i)
        printf("%d\n", Fibonacci(i));
    system("pause");
    return 0;
}


以上


  • Leeroy
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没人理我诶

这个是用斐波纳契数列的另一个公式a[m+n] = a[m] * a[n-1] + a[m+1] * a[n]计算的,每次尽量分出接近的m和n就可以做到近似的二分计算

可惜int能表示的范围太小


2025-06-06 07:45:23
广告
  • 扫除一切菜鸟
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
帮顶


  • Leeroy
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
话说对数学问题感兴趣的人少啊…


  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//输出数列
#include <stdio.h>
int main()
{
unsigned int n;
unsigned __int64 a=0, b=1;
for (scanf("%u", &n); n; n--) printf("%I64u ", a+=b^=a^=b^=a);
return 0;
}


  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
只是为了简洁…


  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
学到公式a[m+n] = a[m] * a[n-1] + a[m+1] * a[n]了,也算有了收获


  • Leeroy
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果只需要第n个的话,你这个是O(n),我这个是O(nlogn),还是有差别的

如果需要简洁的交换的话我宁愿写一个swap函数…


2025-06-06 07:39:23
广告
  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//这个公式不错,这下可以改进速度了

#include <stdio.h>

unsigned __int64 fibonacci(unsigned short n)
{
unsigned short a, b;
if (n<3) return 1;
a=n>>1;
b=(n>>1)+(n&1);
return fibonacci(a)*fibonacci(b-1) + fibonacci(a+1)*fibonacci(b);
}

int main(void)
{
unsigned short n;
while (scanf("%hu", &n))
printf("%I64u\n", fibonacci(n));
return 0;
}


  • Leeroy
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你试一下速度吧,笑

那个数组可不是多余的


  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//我知道,让递归的另一分支能享用到第一支计算的结果,虽然为你的“笑”愤怒,但不可否认确实是个好方法

#include <stdio.h>

unsigned __int64 fib[200]={0, 1, 1};

unsigned __int64 fibonacci(unsigned short n)
{
unsigned short a, b;
if (fib[n]) return fib[n];
b = (a=n>>1) + (n&1);
return fibonacci(a)*fibonacci(b-1) + fibonacci(a+1)*fibonacci(b);
}

int main(void)
{
unsigned short n;
while (scanf("%hu", &n))
printf("%I64u\n", fibonacci(n));
return 0;
}


  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//我知道,让递归的另一分支能享用到第一支计算的结果,虽然为你的“笑”愤怒,但不可否认确实是个好方法

#include <stdio.h>

unsigned __int64 fib[200]={0, 1, 1};

unsigned __int64 fibonacci(unsigned short n)
{
unsigned short a, b;
if (fib[n]) return fib[n];
b = (a=n>>1) + (n&1);
return fib[n]=fibonacci(a)*fibonacci(b-1) + fibonacci(a+1)*fibonacci(b);
}

int main(void)
{
unsigned short n;
while (scanf("%hu", &n))
printf("%I64u\n", fibonacci(n));
return 0;
}


  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
的确不错,又发现了更好的计算方法


  • xiaoer39316766
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
路过...


2025-06-06 07:33:23
广告
  • MasterRay
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一起研究研


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 28回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示