吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3503|回复: 13
收起左侧

[C&C++ 转载] 很基础的斐波那契,为何我输入偶数就停止运行。

[复制链接]
chinalixs 发表于 2015-2-9 14:09
本帖最后由 chinalixs 于 2015-2-9 14:10 编辑

斐波那契这个方法太多了。

但我发现几个问题。

一个是用普通的写法,当N大于48的时候,数会变成负的,网上搜了也有变成负数的,关键不知道怎么解决。求助!
你可以自己随手写一个试试,我就不上图了。

第二个问题,我用这个写法为何输入奇数能数出结果,输入偶数就运行错误呢。我刚入门,完全找不到错误。谢谢大家了!
上代码:
[C] 纯文本查看 复制代码
#include<stdio.h>
#include<malloc.h>
int main(){
        int i,n;
        scanf("%d",&n);

        int* arr=(int *)calloc(n,sizeof(int));

        arr[0]=arr[1]=1;

        for(i=2;i<=n;i++)
        {
                arr[i]=arr[i-1]+arr[i-2];
        }
        printf("%d",arr[n-1]);
        return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

homer 发表于 2015-2-9 14:23
变成负数是因为超出了int类型的最大数字限制导致溢出。你可以使用double等替代,下面是我的简单粗暴的代码~
[C] 纯文本查看 复制代码
#include<stdio.h>
main()
{
    double a=0,b=1,c,i,n=1;
    scanf("%lf",&i);
    for(;n<i;n++)
     {   
        c=a+b;
		a=b;
		b=c;       
     }
    if(i==0) c=0;
    if(i==1) c=1;
    printf("%0.0lf",c);
}
homer 发表于 2015-2-9 14:48
这个是我帮你改过的
[C] 纯文本查看 复制代码
#include<stdio.h>
#include<malloc.h>
int main(){
     
		int i,n;
        scanf("%d",&n);
 
        double* arr=(double *)calloc(50,sizeof(double));
 
        arr[0]=0.0;
		arr[1]=1.0;
 
        for(i=2;i<51;i++)
        {
                arr[i]=arr[i-1]+arr[i-2];
        }
        printf("%0.0lf\n",arr[n]);
		return 0;
}
醉空流澈 发表于 2015-2-9 14:47
第一个问题如homer所说。我的话,就用long。
至于第二个问题,我试了下,不会诶。=_=
Anonymouss 发表于 2015-2-9 19:38
啦啦啦 楼主~

问题一:
int的范围是 -(2^31) ~ (2^31-1),也就是-2147483648 ~ 2147483647;
你看看当n = 47 时 F(n) = 2971215073 >2147483647 ,其实这个时候结果就已经溢出了,不正确了~
可以用long long int类型~ 它的范围是  -(2^61) ~ (2^61-1),更安全,当然也有界限。

问题二:
楼主的代码没有问题,但是你看看for语句运行到了 i = n,而你动态分配的数组a 只有n个空间,a[n]是数组越界的哦~
至于为什么奇偶不同结果,应该和编译器的处理错误的环境有关,至少我用codeblocks 就可以得到正常结果。

 楼主| chinalixs 发表于 2015-2-11 08:49
homer 发表于 2015-2-9 14:23
变成负数是因为超出了int类型的最大数字限制导致溢出。你可以使用double等替代,下面是我的简单粗暴的代码~ ...

谢谢啦。你们俩真好。
 楼主| chinalixs 发表于 2015-2-11 08:49
homer 发表于 2015-2-9 14:48
这个是我帮你改过的
[mw_shl_code=c,true]#include
#include

谢谢啦。你们俩真好。
 楼主| chinalixs 发表于 2015-2-11 10:02
homer 发表于 2015-2-9 14:23
变成负数是因为超出了int类型的最大数字限制导致溢出。你可以使用double等替代,下面是我的简单粗暴的代码~ ...

亲。如果现在我想对c取余怎么办!c是double类型。。。
 楼主| chinalixs 发表于 2015-2-11 10:04
Anonymouss 发表于 2015-2-9 19:38
啦啦啦 楼主~

问题一:

果真是codeblocks更强大。可惜比赛限定了编译环境。我再想办法解决!
 楼主| chinalixs 发表于 2015-2-11 10:08
Anonymouss 发表于 2015-2-9 19:38
啦啦啦 楼主~

问题一:

帮忙看下我换了longlong int 怎么不输出!没有语法错误。上代码
[C] 纯文本查看 复制代码
#include<stdio.h>
main()
{
    long long int a=1,b=1,c,n,i=1;
    scanf("%d",&n);
    for(;i<n;i++)
     {   
        c=a+b;
        a=b;
        b=c;       
     }
    if(n==1) c=1;
    if(n==2) c=1;
    printf("%d",c);
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-30 19:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表