| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3755 人关注过本帖
标题:学渣求帮助 入门训练 Fibonacci数列
只看楼主 加入收藏
luciferxiaoz
Rank: 1
等 级:新手上路
帖 子:13
专家分:5
注 册:2013-11-23
收藏
得分:0 
回复 7楼 czz5242199
这个不对吧= = 数列的值就变了。
2013-11-24 21:54
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
讲一下这个题吧,楼主结的太快了。

首先就是越界,即便你用 long long 早晚也会越界的,所以要换个思路(或者用高精度大数运算,在这显然没那个必要)

公式 (a + b) % c = (a % c + b % c) % c

所以可以使用 7L提供的方法,数列中不再存储斐波那契的值,而是存储其对 10007 的余数,这样对结果没有影响,而且不会越界


[fly]存在即是合理[/fly]
2013-11-24 22:19
Yusoga
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-1-20
收藏
得分:0 
这个题最好别用递归做,用数组在主函数里面实现就好,用递归的话虽然算法没问题,但是时间开销太大,真正测评的时候能过样例就不错了,
我现在也在刷这个题,只拿了70分,1,2,1000000这三个评测数据还过不了,正在优化中...
2014-01-20 21:35
djydaw
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-2-9
收藏
得分:0 
你这个题明显用递归是不行的,肯定会超时,如果建立数组过大,达到1000000也是不行的。我想到一个比较巧妙的方法,已经提交成功了。
#include<iostream>
using namespace std;
int fibonacci(int n){
    if(1==n || 2==n){
        return 1;
    }
    else{
        int i=3;
        int a[2];
        a[1]=a[2]=1;
        while(i<=n){
            if(i%2!=0){
                a[1]=(a[1]+a[2])%10007;
            }
            else{
                a[2]=(a[1]+a[2])%10007;
            }
            i++;
        }
        if(i%2!=0){
            return a[2];
        }
        else{
            return a[1];
        }
    }
}
int main(){
    int n;
    while(cin>>n){
        cout<<fibonacci(n);
    }
    return 0;
}
2014-02-09 10:51
快速回复:学渣求帮助 入门训练 Fibonacci数列
数据加载中...
 
   



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

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