| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3382 人关注过本帖
标题:凌晨写的关于一道斐波那契的题,但系统显示运行超时,求各位朋友指点一二^_ ...
只看楼主 加入收藏
Redeyes
Rank: 4
来 自:中国
等 级:业余侠客
威 望:1
帖 子:301
专家分:292
注 册:2015-5-13
结帖率:86%
收藏
已结贴  问题点数:20 回复次数:12 
凌晨写的关于一道斐波那契的题,但系统显示运行超时,求各位朋友指点一二^_^
问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。
代码如下
程序代码:
#include<stdio.h>
long fib(long n);
long yu;
int main()
{
    long n;
    scanf("%ld",&n);
    yu=fib(n);
    printf("%ld",yu);
    return 0;

 } 
long fib(long n)
{
    if(n==1) return 1;
    if(n==0) return 0;
    if(n>1)
        return ((fib(n-1)+fib(n-2))%10007);
}

运行结果如下
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 朋友 规模 
2016-03-10 03:21
Redeyes
Rank: 4
来 自:中国
等 级:业余侠客
威 望:1
帖 子:301
专家分:292
注 册:2015-5-13
收藏
得分:0 
顺便还想请教下各位大神,在编译器编译正确的情况下,一般在线提交遇到“运行超时”“答案错误”“格式错误”这些常见问题时,是从代码的哪些方面进行考虑的,谢谢!

做一名健壮的技术青年,如果未来无法用代码去改变世界,还可以考虑去搬砖。
2016-03-10 03:24
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:4 
程序代码:
#include<stdio.h>

long fib(long n);

int main()
{
    long n,yu;
    scanf("%ld",&n);
    
    yu=fib(n);
    printf("%ld",yu%10007);
    
    return 0;

 }

 
long fib(long n)  //你的此函数根本就是不对的
{
    if(n==1||n==2)  return 1;
    
    return  fib(n-1)+fib(n-2);
}

   唯实惟新 至诚致志
2016-03-10 08:17
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:5 
说一下我的看法,首先要学一点数学知识,关于除余的,(a+b)mod n是否可以这样求(a mod n+b mod n) mod n 这样的话在计算各项时,最大值始终小于10007,其次编码上,用递归不合适,用循环就行,应该不是很难,最后,关于多组数据,每组数据之间是有着关联的,在计算比较大的数时,中途是可以得到比较小的数的答案的,所以整组的计算其实就是对最大数的计算,没有必要对每个数进行计算。
2016-03-10 08:35
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:1 
回复 3楼 qq1023569223
你这个代码估计也不能通过,因为n的最大值是1000000,估计数列已经超出了long long的数据表示范围。
我用如下函数返回数列:
int f(int n)
{
        return n<3?1:f(n-1)+f(n-2);
}

能编个毛线衣吗?
2016-03-10 08:41
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:1 
回复 5楼 wmf2014
恩,我没试过最大多大。

   唯实惟新 至诚致志
2016-03-10 08:44
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:2 
应该按4楼的思路去做。

能编个毛线衣吗?
2016-03-10 08:46
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:2 
栈空间再大,这么多重递归也该炸了

不要用递归


[fly]存在即是合理[/fly]
2016-03-10 09:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
4楼和8楼说得很好,当然,还可以继续优化,因为“Fn除以10007的余数”这一句,所以必然会出现重复循环,就是n %= 20016这一句

程序代码:
#include <stdio.h>

int main( void )
{
    unsigned n;
    scanf( "%u", &n );
    n %= 20016;

    unsigned a=1, b=0;
    while( n-- )
    {
        unsigned c = (a+b)%10007;
        a = b;
        b = c;
    }
    printf( "%u", b );

    return 0;
}

2016-03-10 10:02
Redeyes
Rank: 4
来 自:中国
等 级:业余侠客
威 望:1
帖 子:301
专家分:292
注 册:2015-5-13
收藏
得分:0 
好的,谢谢各位指点。当时就想着去实现结果,没有考虑程序的复杂性,空间等问题...

做一名健壮的技术青年,如果未来无法用代码去改变世界,还可以考虑去搬砖。
2016-03-11 02:00
快速回复:凌晨写的关于一道斐波那契的题,但系统显示运行超时,求各位朋友指点一 ...
数据加载中...
 
   



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

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