其实程序员还不如小学生

标签: 其实 程序员 小学生 | 发表时间:2011-09-22 14:09 | 作者:keakon CMGS
出处:http://www.keakon.net/
今天在群里看到这样一道空瓶换汽水的题,引起了大家的讨论:


说实话,当我看到这题时,我第一个想到的解法是极限。
假设每次都能整除,那么这题实际上相当于一个等比数列求和:第一次能喝的汽水数量是1000,公比是1/3,因此结果就是(1000 - 1000 * (1 / 3)n) / (1 - 1 / 3)。当n趋向于正无穷大时,1000 * (1 / 3)n的极限为0,因此结果是1500。考虑到可能会剩下空瓶,所以应该是≤1500。

接着看到程序员的解法,自己也动手写了个:
# -*- coding: utf-8 -*-

def calculate(drinks):
	total = 0
	times = 0
	bottles = 0
	while drinks > 0:
		times += 1
		total += drinks
		bottles += drinks
		exchanged = bottles / 3
		left = bottles % 3
		bottles = left
		print u'第%d次兑换,喝了%d瓶,兑换了%d瓶,剩%d个空瓶,共喝了%d瓶' % (times, drinks, exchanged, left, total)
		drinks = exchanged

calculate(1000)
结果如下:
第1次兑换,喝了1000瓶,兑换了333瓶,剩1个空瓶,共喝了1000瓶
第2次兑换,喝了333瓶,兑换了111瓶,剩1个空瓶,共喝了1333瓶
第3次兑换,喝了111瓶,兑换了37瓶,剩1个空瓶,共喝了1444瓶
第4次兑换,喝了37瓶,兑换了12瓶,剩2个空瓶,共喝了1481瓶
第5次兑换,喝了12瓶,兑换了4瓶,剩2个空瓶,共喝了1493瓶
第6次兑换,喝了4瓶,兑换了2瓶,剩0个空瓶,共喝了1497瓶
第7次兑换,喝了2瓶,兑换了0瓶,剩2个空瓶,共喝了1499瓶

最后看到小学生的写法,发现果然简单,而且小学时我确实就是那样解题的…
不过现在又有个新问题了:小学生算出来的结果是1500瓶,比程序员多了一瓶,这难道是整除的原因么?

想了一下后我发现,按照正常情况,空瓶最后总会剩下的:如果剩1~2瓶,自然无法兑换;如果剩3瓶,最后换1瓶,还是会剩1个空瓶——这就是程序员得出1499的原因。
小学生的漏洞在于那个等式其实应该是不等式:x - 1000 ≤ x / 3。
不过现实是最后会剩下2个空瓶,小学生可以先借一瓶,喝完后剩3个空瓶,兑换一瓶还回去,于是就1500瓶了。但傻兮兮的程序员还抱着2个空瓶,自以为是最佳解了…

相关 [其实 程序员 小学生] 推荐:

其实程序员还不如小学生

- bluecat - FeedzShare
来自: keakon的涂鸦馆 - FeedzShare  . 发布时间:2011年09月22日,  已有 2 人推荐. 今天在群里看到这样一道空瓶换汽水的题,引起了大家的讨论:. 说实话,当我看到这题时,我第一个想到的解法是极限. 假设每次都能整除,那么这题实际上相当于一个等比数列求和:第一次能喝的汽水数量是1000,公比是1/3,因此结果就是(1000 - 1000 * (1 / 3)n) / (1 - 1 / 3).

普通程序员、文艺程序员、2B程序员

- 可可 - 宇宙的心弦
希望能引起广大苦逼的正在学或者已经学过c++人的共鸣和会心一笑吧. 如何辨别自己在现实还是虚拟世界.

如何面试程序员?

- bluesnail - 阮一峰的网络日志
你要面试一个程序员,应该问他什么问题. 有人在Hacker News的讨论区里,请求指点,怎么才能在面试中发现合格的人. 众人纷纷出主意,有很多高质量的回帖,我觉得挺有启发,就整理出了下面这篇文章. 首先,最重要的是,你自己一开始就应该想清楚:. 哪些途径和方法可以发现这样的人. 只有明确这些根本性的问题,才能正确高效地完成面试.

程序员的本质

- Allen - 译言-电脑/网络/数码科技
来源What do programmers really do?.   很多人(包括我岳母)认为计算机变得如此智能,所以在不久的未来将不再需要程序员. 另外一些人认为程序员是天才,他们在电脑前能不断地解决复杂的数学难题. 甚至不少程序员对他们是做什么的都没有清晰的概念.   在这篇文章中,我想给不知情的人解释一下程序员到底是做什么的:.

程序员人生之路

- myartings - 博客园-首页原创精华区
   程序员人生之路(强烈推荐,分析的透彻. ),某程序达人的人生感悟,估计没有半个甲子的时间,是绝对不可能感悟出来的.    相对同时刚出校门同学从事其它行业而言优厚的薪水,以及不断学习更新的专业知识不仅仅让你感到生活的充实,更满足了你那不让外人知的虚荣心. 在刚出校门的几年中,你经常回头看看被你落在后面的同学们,在内心怜悯他们的同时,你也会对自已天天加班的努力工作感到心里平衡:“有付出才会有回报”这句话在那几年中你说的最多,不管是对自已的朋友们还是自已的爱人.

程序员装B指南

- Qing-Run - 博客园-首页原创精华区
1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好. 一个用来查资料,一个用来写代码. 总之要显得信息量很大,效率很高. 2.椅子不一定要舒服,但是一定要可以半躺着. 3.大量的便签,各种的颜色的,用来记录每天要完成的事务,多多益善. 沿着电脑屏幕的边框,尽量贴满,显出有很多事情的样子.

程序员收入报告

- diaoxsh - cnBeta.COM
最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告. 数据显示,上月是目前为止他收入最多的一个月. Chris的收入并不是指他的工资或薪水,Chris是一个自由职业者. 他的收入也不是来自个人承包软件工程的收入,他更像是一个果农,种了优良的果树,只要不断的给这些果树施肥浇水,这些果树会给他带来源源不断的财富.

程序员的利器-SourceInsight

- Alex - 博客园-首页原创精华区
作为程序员,大部分时间是在已有的代码上代码工作. 要对已有的代码进行调整,首先就要搞清楚当前代码中蕴含的逻辑关系. 所以常常有程序员调侃说花了大半天时间看代码,最后写代码的时间只有几分钟. 所以,对已有代码的分析质量将影响(甚至会决定)最终代码修改的质量. SourceInsight在代码分析上给予程序员极大的帮助.