健身房年卡
去年办的卡,今年第一次来。
  • 注册会员
circle-image
文章总计
0 篇文章
circle-image
获赞数
circle-image
总阅读量
0 阅读
circle-image
主页人气
676 人气
文章 动态 帖子
看起来这里没有任何东西。

加载中...

加载中...

  • 这帖子真给我看笑了。标题甩着“信息学奥赛一本通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

加载中...

来跟我聊聊吧~