| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2430 人关注过本帖
标题:输出Fibonacci数列中的前N项(从2开始输出的头3个数0 1 1 没有输出)
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用beyondyf在2012-12-6 10:45:17的发言:

那我也写一段和万哥交流吧。输出比较多,建议输出到文件再查看。

这段代码稍加改动即可完成原来那个朋友要做的题目。
#include
 
#define MAX_N    500
#define MAX_LEN    128
 
int main()
{
    char f[MAX_N][MAX_LEN] = {"1","1"};
    int a[MAX_LEN] = {1}, b[MAX_LEN] = {1}, c[MAX_LEN] = {};
    int *p = c, *p1 = b, *p2 = a, *pt;
    int i, j, t;
   
    for(i = 2; i < MAX_N; pt = p2, p2 = p1, p1 = p, p = pt, i++)
    {
        for(t = j = 0; j < MAX_LEN; t = p[j] > 9 ? p[j] -= 10, 1 : 0, j++) p[j] = p1[j] + p2[j] + t;
        for(j--; !p[j]; j--);
        for(t = 0; j >= 0; f[t++] = p[j--] + '0');
    }
            
    for(i = 0; i < MAX_N; printf("F[%03d] = %s\n", i, f));
   
    return 0;
}
太精炼了   晚上回去研究
另:我发现杨兄弟的代码有个特点  那就是本来应该是循环体内部的东东,你都放到for后面的括号里
问一下,这么做 除了代码精炼之外 还有其他好处吗

DO IT YOURSELF !
2012-12-06 10:52
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
c[MAX_LEN] = {};
这里是笔误吗
我电脑里要int c[MAX_LEN] = {0};才能编译通过

DO IT YOURSELF !
2012-12-06 11:05
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
除了符合我个人的审美,没什么好处。放在哪儿效率都是一样的。

如果一句能表达一个独立的逻辑整体,我就会把它们放在一起。

比如外循环计算每一个fibonacci项。内部第一个循环完成相应项数值的计算,第二个循环寻找数值头,第三个循环完成数值到字符串的转换。

for语句的迭代部分完全相当于for的末尾部分。表达的是循环结束后的处理部分,符合这一条件的逻辑如果不太长的话我会直接放在迭代部分里。

必须强调,这只是我的个人风格,与我的思维习惯有关,不建议刻意模仿。

[ 本帖最后由 beyondyf 于 2012-12-6 11:15 编辑 ]

重剑无锋,大巧不工
2012-12-06 11:10
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 12楼 wp231957
不是笔误,我一直这么写,用的是GCC编译器。很久没用过VC了,没想到你那里会不支持这种初始化方式。你改的没错,加个零和我的本意是一样的。

重剑无锋,大巧不工
2012-12-06 11:13
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
简单的改了改
程序代码:
#include<stdio.h>

#define MAX_N      50
#define MAX_LEN    128

int main()
{
    char f[MAX_N][MAX_LEN] = {"1","1"};
    int a[MAX_LEN] = {1};
    int b[MAX_LEN] = {1};
    int c[MAX_LEN] = {0};
    int *p  = c;
    int *p1 = b;
    int *p2 = a;
    int *pt;
    int i, j, t;

 
    for(i = 2; i < MAX_N; i++)
    {
  
        for(t = j = 0; j < MAX_LEN; j++)
        {
            p[j] = p1[j] + p2[j] + t;
            if(p[j]>9) {t=1;p[j]-=10;} else t=0;
        }
        for(j = MAX_LEN - 1; p[j] == 0; j--);
        for(t = 0; j >= 0; t++) { f[i][t] = p[j] + '0';j--;}
        pt = p2;
        p2 = p1;
        p1 = p;
        p  = pt;
    }
         
    for(i = 0; i < MAX_N;i++) printf("F[%03d] = %s\n", i, f[i]);

 
    return 0;
}


[ 本帖最后由 wp231957 于 2012-12-6 13:23 编辑 ]

DO IT YOURSELF !
2012-12-06 12:13
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
我的代码中指针的调换是在末尾,你放在了开始。这可不是我的思维

不知道干啥的那句你可以删了看看是什么效果。

重剑无锋,大巧不工
2012-12-06 12:17
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用wp231957在2012-12-5 21:14:05的发言:

计算了接近500个Fibonacci数列  用时不到1秒  却是挺快的

CPU 1秒钟能执行几十亿条指令。。
2012-12-06 12:19
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
好像我知道是干啥的了

但是我不明白这句代码怎么理解
for(j--; !p[j]; j--);    一般循环有起步条件 终止条件  步长  这里2个J--就给我弄迷糊了

DO IT YOURSELF !
2012-12-06 12:22
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用beyondyf在2012-12-6 12:17:06的发言:

我的代码中指针的调换是在末尾,你放在了开始。这可不是我的思维
for(i = 2; i < MAX_N; pt = p2, p2 = p1, p1 = p, p = pt, i++)

先执行粉色部分
然后再执行循环体
然后执行绿色部分
最后执行i++
是这样吗


DO IT YOURSELF !
2012-12-06 12:30
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
写成for(j = MAX_LEN; p[j] == 0; j--);会不会好理解一些?

重剑无锋,大巧不工
2012-12-06 12:32
快速回复:输出Fibonacci数列中的前N项(从2开始输出的头3个数0 1 1 没有输出)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022062 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved