| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10635 人关注过本帖
标题:关于斐波那契数列
只看楼主 加入收藏
dada125
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2011-11-3
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
关于斐波那契数列
我刚学c,写了个斐波那契数列的程序,但是从48项开始结果就是负数了,怎么回事啊?有哪位大侠解答一下!
ps:我曾把int  f1,f2,f3;改为long f1,f2,f3;还是没用!第48个值为:-811192543
/*
    2011年11月3日20:21:25
    斐波那契数列指第n项是前两项之和:1,2,3,5,8,13,21以此类推
    斐波那契数列第n项的值

*/
#include<stdio.h>
int main (void)
{
    int  f1,f2,f3;
    int n =1,i;
    while ( n != 0)
    {
        f1 = 1;
        f2 = 2;
        printf("请输入n的值:(退出请输“0”)");
        scanf("%d",&n);
        if (n ==1)
        {
            printf("第%d个值为:%d\n",n,f1);
        }
        else if (n == 2)
        {
            printf("第%d个值为:%d\n",n,f2);
        }
        else if (n >= 3)                 //从第三项开始的算法
        {
            for(i = 3; i <=n; i++)
            {
                f3 = f1 + f2;
                f1 = f2;
                f2 = f3;
            }
            printf("第%d个值为:%d\n",n,f3);
        }
        else if ( n != 0)
        {
            printf("您输入的值有误,请重新输入!\n");
        }   
    }

    return 0;

}

/*
    在WIN7下Vc++6.0中的输出结果是:
    ------------------------------
    能正确显示到第46项。
    ------------------------------
*/

[ 本帖最后由 dada125 于 2011-11-4 10:10 编辑 ]
搜索更多相关主题的帖子: include 
2011-11-03 21:05
molflike
Rank: 2
等 级:论坛游民
帖 子:2
专家分:23
注 册:2011-11-1
收藏
得分:3 
长整形的范围是 -2147483648到2147483647,
到46时候就已经过范围溢出了
2011-11-03 21:13
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:3 
int的标准是4字节的有符号数,也就是说它能表示的范围是-2147483648到2147483647
根据编译器的不同,可能在64位操作系统下的编译器标准int为8字节,不过看你的样子显然是四字节的标准

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-03 21:50
dada125
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2011-11-3
收藏
得分:0 
对啊。46的时候就是负数了。但是47为什么是正数呢
请输入n的值:(退出请输“0”)45
第45个值为:1836311903
请输入n的值:(退出请输“0”)46
第46个值为:-1323752223
请输入n的值:(退出请输“0”)47
第47个值为:512559680
请输入n的值:(退出请输“0”)48
第48个值为:-811192543
请输入n的值:(退出请输“0”)0
2011-11-03 21:56
劣质数轴
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:163
注 册:2010-11-19
收藏
得分:3 
溢出了……

要么用double类型,要么就用数组来处理大数。
2011-11-04 00:08
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:3 
这里面是关于计算机组成原理里面数据表示问题,数据在计算机内存里是以补码表示的,通过运算进位可能最高位(符号位)由1变为0,使得结果变为正。
但从程序来说,是溢出了。

[ 本帖最后由 liao06550107 于 2011-11-4 00:57 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2011-11-04 00:55
sun_shang001
Rank: 2
等 级:论坛游民
帖 子:103
专家分:78
注 册:2011-10-27
收藏
得分:3 
#include"stdio.h"
int main()
{
    int f1=1,f2=1,f3;
    int i;
    printf("%12d\n%12d\n",f1,f2);
    for(i=1;i<=45;i++)
    {
        f3=f1+f2;
        printf("%12d\n",f3);
        f1=f2;
        f2=f3;
    }
    system("pause");
    return 0;
}
最后一位(47位)开始溢出 为负
2011-11-04 02:24
dada125
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2011-11-3
收藏
得分:0 
哦。大概知道了。我刚学,好多知识还没涉及到。先谢谢各位拉!以后少不了要麻烦大家!
2011-11-04 10:09
mahuaguan
Rank: 1
等 级:新手上路
帖 子:38
专家分:4
注 册:2011-9-13
收藏
得分:3 
6楼正解
2011-11-04 10:44
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
用64位的整型数能满足要求
__int64    f1, f2, f3
输出的时候格式是:printf ("%I64d\n", f3);

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-04 14:47
快速回复:关于斐波那契数列
数据加载中...
 
   



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

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