免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 25532 | 回复: 14
打印 上一主题 下一主题

[算法] Fibonacci数列C语言算法问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-28 17:54 |只看该作者 |倒序浏览
    请各问各位前辈,用C语言编一个程序计算出斐波那契数列的第N位数,如果不用递归算法而是用循环的话,应该如何实现呢(最好也不用数组)?我想了一个下午都没有任何进展,请各位帮忙看看。感激不尽!
   下面我做了个函数调用的测试,但关键部位还是想不出来。
  1. #include <stdio.h>

  2. unsigned long test_fibonacci(int n);


  3. int main(void)
  4. {
  5.     int n;
  6.    
  7.     printf("Enter a positive integer (q to quit): ");
  8.     while(scanf("%d", &n) == 1)
  9.     {
  10.         printf("\nThe %dth number in the fibonacci numbers is %lu",
  11.                n, test_fibonacci(n));
  12.         printf("\nEnter a positive integer (q to quit): ");
  13.     }
  14.     puts("\nDone!");

  15.     return 0;
  16. }

  17. unsigned long test_fibonacci(int n)
  18. {
  19.     int i, sum = 0;

  20.     if(n <= 2)
  21.         sum = 1;
  22.     else
  23.         for(i = 2; i <= n; i++)
  24.         {
  25.         }

  26.     return sum;
  27. }
复制代码

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
2 [报告]
发表于 2013-03-28 18:37 |只看该作者
搞个数组,把每个算过的值都存起来。
贴个python的循环程序
  1. f=[0,1]
  2. for n in range(2, 10):
  3.         f.append(f[n-1]+f[n-2])
  4. print f[-1]
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-03-28 18:43 |只看该作者
windoze 发表于 2013-03-28 18:37
搞个数组,把每个算过的值都存起来。
贴个python的循环程序

谢谢你,丰衣足食。用数组来存储有其可取之处,不过很难确定数组的大小,因为不知程序的使用者想制定斐波那契数列中的哪一位,所以最好能够避免使用数组。
请各位继续不吝赐教!多谢!

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2013-03-28 18:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2013-03-28 18:49 |只看该作者
pmerofc 发表于 2013-03-28 18:43
回复 1# mcmay


你好,pmerofc。就是说,比如:1 1 2 3 5 8 13 21 ...,如果N = 3就是2,N = 6就是8,等等。谢谢!

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
6 [报告]
发表于 2013-03-28 18:53 |只看该作者
本帖最后由 windoze 于 2013-03-28 18:53 编辑

回复 3# mcmay

其实这个问题远比你想象的麻烦,首先,只要你用的是递推公式,把N之前的所有项都算一遍是不可避免的,如果你不存中间结果,那将会是一个O(2^n)复杂度的算法;其次,算不了多少个你就会发现用int之类的类型存不下了,还得搞个大整数的库神马的。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
7 [报告]
发表于 2013-03-28 20:00 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2013-03-28 20:45 |只看该作者
这个很简单吧
  1. #include <stdio.h>

  2. unsigned long fibonacci(unsigned long N){
  3.         unsigned long ar[] ={0UL,1UL,1UL,2UL};
  4.         unsigned long iAnswer =0;
  5.         for(iAnswer =1UL;iAnswer <N;iAnswer++){
  6.                 ar[(iAnswer +1)&0x03UL] =ar[(iAnswer -1)&0x03UL] +ar[iAnswer&0x03UL];       
  7.         }
  8.         return ar[iAnswer&0x03UL];
  9. }

  10. int main(void){
  11.         for(unsigned long iN =1;iN <20; iN++){
  12.                 printf("%ld ",fibonacci(iN));
  13.         }
  14.         return 0;
  15. }
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2013-03-28 21:03 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2013-03-28 21:31 |只看该作者
听君一席话,胜读十年书。楼上几位的点拨让我茅塞顿开!尤其是pmerofc和folklore两位仁兄的代码解析,迭代法在此又展神威。还请folklore说一下代码中“&0x03UL”是什么,我有些看不明白。好像是将数组元素个数往后延展,不过不知如何达到这个功能的,看起来有点像汇编的样子。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP