c语言fibonacci数列问题

想用数组求出结果,但改了很多次都是报错,找不出来问题,哪位大神看一看... 想用数组求出结果,但改了很多次都是报错,找不出来问题,哪位大神看一看 展开
 我来答
拥抱Linux
2019-03-06 · 知道合伙人教育行家
拥抱Linux
知道合伙人教育行家
采纳数:418 获赞数:2160
大学的校级奖学金,机械行业十年工作经验

向TA提问 私信TA
展开全部

错误不少。

  1. 定义数组a[]的时候,为了确保数组获得可靠、可信的内存单元,数组的长度必须是一个确定的值,所以变量n还不确定的时候,不能定义为a[n]。否则的话,数组a[]中的元素是不确定的,不能直接使用,而且虽然可以使用a[下标]来读取到一个值,但是这样的操作是很危险的,因为读取到的这个值或许是其它程序或系统正在使用的内存单元的值,要是再对a[下标]赋值来改变了这个值的话,还会影响到其它程序或系统,产生危害其它程序或系统正常运行的隐患。

  2. unsigned long int型,匹配的格式符是%ld。

  3. for循环里,使用对a[n]赋值存在隐患,具体就是上面第1点说的,因为在定义数组a[]的时候,并没有为数组a[]分配一个独立的内存空间。

  4. 语句「return 0」的末尾,缺少了分号。

其实可以不用定义数组,只要定义3个变量能够参与运算就可以了,示例代码如下,

#include <stdio.h>

int main()
{
    unsigned long int n, a0, a1, an, i, k;
    a0 = 1;
    a1 = 1;
    scanf("%ld", &n);
    if (n == 1)
        printf("%ld\n", a0 % 10007);
    else if (n == 2)
        printf("%ld\n", a1 % 10007);
    else
    {
        for (i = 2; i < n; i++)
        {
            an = a0 + a1; // f(n) = f(n-2) + f(n-1)
            a0 = a1;  //为下一次计算做准备,
            a1 = an;  //下一次计算的两个加数就是现在的数列中的最后两个数
        }
        printf("%ld\n", an % 10007);
    }

    return 0;
}

如有帮助,烦请点采纳,谢谢!

更多追问追答
追问
可以直接算出结果,程序也很顺,但不知道为什么评测系统给的是三十分,可以不用算出原数直接求余吗?

丿艾瑞灬莉娅
2019-03-06 · TA获得超过916个赞
知道小有建树答主
回答量:926
采纳率:78%
帮助的人:428万
展开全部

提示得很清楚了,直接求fn肯定是溢出的,下面是我的ac代码

#include <stdio.h>

int main()
{
    int i, n;    
    int f1 = 1, f2 = 1, fn = 1;
    
    scanf("%d", &n);
    for(i = 0; i < n-2; ++i){
        fn = f1 + f2;
        if( fn >= 10007 )
            fn %= 10007;
        f1 = f2;
        f2 = fn;        
    }
    printf("%d", fn);
    
    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
linjunlzy
2019-03-06 · TA获得超过1319个赞
知道小有建树答主
回答量:668
采纳率:82%
帮助的人:333万
展开全部
除了a[n]其他设置为int类型就够了。最后的printf里改成%llu。(我也忘了是不是%llu 反正%d最多只能输出int类型的最大值肯定错)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
听不清啊
高粉答主

2019-03-06 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部
#include<stdio.h>
int main()
{int i,n,f[10000]={1,1};
 scanf("%d",&n);
 for(i=2;i<n;i++)
   f[i]=(f[i-1]+f[i-2])%10007;
 printf("%d\n",f[n-1]);
 return 0;
}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-03-06
展开全部
return 0后面少了个分号
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式