返回

信息学奥赛一本通C++语言-----1071:菲波那契数

【题目描述】
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数k,要求菲波那契数列中第k个数是多少。
【输入】
输入一行,包含一个正整数k。(1 ≤ k ≤ 46)
【输出】
输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小。
【输入样例】
19
【输出样例】
4181

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int k,f,f1=1,f2=1;
    scanf("%d",&k);
    f=1;
    for(int i=3;i<=k;i++)
    {
        f=f1+f2;
        f1=f2;
        f2=f;
    }
    printf("%d",f);
    return 0;
}
分享到
QQ 微信 微博 复制链接
微信分享二维码

微信扫一扫,分享给好友

本文来自投稿,不代表本站立场,如若转载,请注明出处:

发表评论

V注册会员 L评论等级
R5 条回复
  1. 2026-09-08     Android /    UC浏览器

    真是服了,能不能别拿这种题库页面当博客发?一个题目描述加个样例,就叫文章了?我点进来还以为能看到点别的,结果比纸还白。 不过既然来了,就说点实在的。这题讲斐波那契,就是第一个第二个都是1,后面每个数等于前面俩加起来。好多新手上来就照递归写,我也干过,觉得自己老聪明了,结果交上去,后面几个数卡得跟幻灯片似的。为啥?每次算都重复算前面那些数,算个f(40)能把前面的数折腾上百遍,能不慢吗?后来我就老老实实写循环了,整三个变量,a、b、c,c等于a加b,然后a变b,b变c,一趟下来完事。46个数?那不就是眨眼的功夫。 再一个,题目把k的范围顶到46,这个数挺贼。我闲着没事算过,第46个斐波那契数是1836311903,而int最多能存2147483647,也就是说第46项还没撑爆,但第47项肯定爆,一爆就成负数。我当年真见过负数,就死活想不通,斐波那契数列还能有负数?后来才知道是int装不下了。所以做题最好直接用long long,反正现在内存又不要钱。当然你要是刷一本通这种老题,它写着一到46就是给int留的面子,但咱别当回事,用长整型稳一点没毛病。 还有标题写的是“菲波那契”,我寻思标准名字不是“斐波那契”么?就那个兔子数列,意大利的数学家。这个错字看着别扭,不过也算常见了,可能作者拼音输入法把fei打错了,不管他。 样例19输出4181,我核过,的确没错。斐波那契嘛,第19项就是4181。这数列其实就是兔子生小兔子那事,一个比一个能生,跟现实里养兔子完全两回事。不过竞赛出这个题基本就是练循环,也没啥深意。 最后提醒一句:别信有些教材里写得好看的那段递归代码,应付笔试可以,刷OJ别用。这题真正的坑不是在算法上,是打字的时候别把斐波那契写错(笑)。

    回复
  2. 2026-09-04     Android /    Chrome

    46的斐波那契,递归都能秒出,别整花活了。

    回复
  3. 2026-09-03     iPhone /    Safari

    这帖子真给我看笑了。标题甩着“信息学奥赛一本通C++语言”这么一大串,进来一看正文就光秃秃一个题,连个main函数都见不着。C++呢?代码呢?解析呢?啥都没有,你这文章写成这样,是等着读者自己脑补出个程序来?真的服了,网上怎么净是这种复制粘贴的玩意儿,一道题抄过来就敢发,连个标点都不带改的。 先别急着骂我挑刺,我当年也是刷这本一本通长大的,看到菲波那契这四个字,心里那股窝囊劲儿一下就上来了。人家正经不都叫斐波那契吗?斐——波——那——契,Fibonacci音译过来,你写菲波那契也行,可你这《信息学奥赛一本通》从教材到OJ全用“菲波”,搞得好多初学者查资料的时候搜“菲波那契数”,搜出来一堆乱七八糟的没人看的页面,换成“斐波那契”才搜到正经教程。一个数列连名字都不统一,真是坑死强迫症。 再说这题本身,k≤46,这数卡得是真妙啊。费点劲算算:第44项是701408733,第45项是1134903170,第46项是1836311903。你看看1836311903,离int上限2147483647就差三亿多,正好能塞进老的int里。你要是再往后走一项,第47项是2971215073,直接爆掉。出题人肯定是拿计算器按到第46项,一看,哎哟,还没超,行了就定46吧。你要是出到47,这道题用int写循环的人全得负数,到时候OJ上哭天喊地,那教学效果多“好”啊。可你一个教C++的破题,难道不知道有个东西叫long long?把范围放到90用long long也没事啊,F(92)都还没超呢。非卡在46,显得自己很精确?我看就是懒,懒得多讲一种整数类型,懒得多改一个测试数据。 我上初中的时候刚开始接触这题,课本上正好前面讲递归,老师也刚讲完递归函数,我就跃跃欲试。看到这道题,心里想:这不就是天生的递归?f(1)=f(2)=1,f(k)=f(k-1)+f(k-2),多漂亮,直接用。当时我还觉得自己贼聪明,三下五除二写了个递归交了。测试几个小数没问题,输入样例的19,瞬间出来4181,没错。我心说就这么简单?那就来点刺激的,输入46吧,看看这个第46项到底多大。好家伙,按完回车,那个黑乎乎的Dev-C++窗口开始转圈圈,风扇呼呼响,等了半天就是不输出。我以为死循环了,又等,等到上课铃响了还没出结果。我吓得赶紧按Ctrl+C,然后一脸懵地去找老师,老师过来瞥了眼我代码,说你这是递归?我说是啊。老师没骂人,就叹口气,给我改成for循环,一秒钟出来1836311903。那时候我才知道,递归不记忆化,简直是个大坑。你算f(46),它得先算f(45)和f(44),算出f(45)又得算f(44)和f(43),这里面f(44)来回算了不知道多少遍,整个调用次数长得吓人,差不多是棵大树,节点数估计比地球人口还多。后来看别人说这叫重复计算,说人话就是你让同一个人干同一件事干了几亿遍,你不等死谁等死。 所以这道题真正该教给新手的,根本不是“菲波那契数列是什么”,而是“别一看见递归定义就真用递归写”。可这篇文章倒好,题目原文甩出来就没了,既不说递归会超时,也不给循环解法,也不提醒int边界,就留个输入样例19、输出4181,跟让你自己悟似的。我能悟啥?我只能悟到这是个凑数博客,作者大概洗个手的功夫就把题目贴上来了。 真不怪我想骂人。你看标题,“信息学奥赛一本通C++语言-----1071:菲波那契数”,中间五个横杠打得好随意,前面一个空格都没有,后面跟个1071。你再看看正文排版,输入样例和输出样例中间空行都没有,手机上看挤成一大坨。这种文章发出来能干嘛?流量赚不到,用户点进来骂一句就走了;学习资料?就是个习题册原文,教材上白纸黑字也有。唯一的功能可能就是让人练练白眼翻得有多快。我翻到底都没翻到“#include”,真服了,你说你是C++语言文章,你最起码贴个int main吧?好家伙,比我看的小说结尾还开放,代码全靠自己想。 有一说一,题目本身倒没啥毛病。菲波那契数列这东西,练循环、练数组、练递推都挺好用,以后学动态规划它还得出来当炮灰。可是这道题有个特别阴险的点,就是定义。它说“数列的第一个和第二个数都为1”,那好,k=1输出1,k=2也输出1,这是从第1项开始的。但很多资料里偏爱从第0项开始,F(0)=0,F(1)=1,然后第0项是0,第1项是1,第2项才是1。你如果从网上搜“斐波那契数列第46项”,有的页面说是1836311903,有的说是2971215073,鬼知道他们谁把0算进去了。你再看这题目,敢情它为了避开这个争议,特意写“第一个和第二个数都为1”,算是把定义钉死了。这一点我倒认同,比那些直接抛个“0,1,1,2,3”就开始讲的强。可问题是你光钉死定义有什么用?你倒是讲一讲怎么算啊。 说说我后来怎么给新手讲这题吧,就写一个数组,a[1]=1,a[2]=1,然后for(int i=3;i

    回复
  4. 2026-08-11     Android /    Chrome

    这题我当年刚学的时候可没少踩坑。题目说“第一个和第二个数都为1”,我上来就写递归,结果一跑k=46,电脑直接卡成PPT,风扇呼呼转,最后还得重启。后来才反应过来,光想着“每个数等于前面两个数相加”,可递归中间重复算的太多了,46层下去那数量吓死人。其实这题k最大才46,开个数组一个一个推过去不就完了么,或者干脆拿两个变量来回倒,循环个几十次,输出4181也就是一瞬间的事。题解里光给个输入输出样例,也不提醒一下递归会超时,新手哪知道这个坑啊。顺便说一句,样例19输出4181我手动验过,没问题,但这题最大的考点根本不在菲波那契数本身,在怎么避免傻递归。

    回复
  5. priligy reГ§etesiz alД±nД±r mi :
    2025-03-10     Win 10 /    Chrome

    cialis with priligy The Center for Medicare and Medicaid Services sponsored Medicare program covers hospital services, physician services, some drug therapy, and other medical services for more than 97 of persons aged 65 years and older

    回复
没有更多评论了

作者信息

    请配置好页面缩略名选项

推荐话题

关于本站

来跟我聊聊吧~