学习分享

【学习方法】从一道小学数学题说起——计算思维第一步

djfish 发表于2017年12月17日
<p>之前分享了英语,阅读,以及各种人文社科类的学习经验,一转念,发现我是搞IT的啊。怎么也得聊几句本行业吧,很多朋友问想学计算机怎么入门?中M上课很多,先学哪个?</p><p>一个一个问题解决。</p><p><strong>一.怎么入门?</strong></p><p>先培养计算思维,中M课程相关课程,有四个学校开设,各有侧重,建议学习顺序如下:</p><p>1.《<strong>计算思维的结构</strong>》——桂林电子科技大学 介绍计算思维,从问题入手,不涉及具体编程,都是关于计算机比较底层的介绍,属于激发兴趣点的入门课程。</p><p>2.《<strong>大学计算机——计算思维导论</strong>》——哈尔滨工业大学 算是计算机普及课,讲了常见算法还包括大数据,互联网涉及的基础知识,要深入一些。</p><p>3.1《<strong>大学计算机——计算思维的视角</strong>》——山东大学 这个基本上算初级程序编写入门,需要学C/C++。</p><p>3.2《<strong>大学计算机——计算思维之路</strong>》——北京交通大学,这个和山东大学的内容程度相当,也有程序编写入门,需要学python。</p><p><br ></p><p><strong>二.语言那么多,学什么?</strong></p><p>中M上就有C/C++,JAVA,python, Visual Basic这么多种,看的人眼花缭乱,怎么破?</p><p>选择原则:</p><p>1.<strong>工作的</strong>,你公司用啥选啥,精进就是了。</p><p>2.<strong>上学的</strong>,迷茫中,根据你的课题需要选,上学其间先把本专业要用的软件弄熟了,再学编程语言。例如:自动化专业的,选Matlab相关的课程,也是编程用的。跟计算机专业的编程不一样,但专业必备的利器,学好它。</p><p>3.<strong>爱好者</strong>:用各种语言实现一个hello world,看你喜欢哪种风格,然后学就是了。</p><p>网络编程java,.net兴起,大数据火了,就都一窝蜂的学python,物联网让C又成了焦点,手机开发又促成Go语言。。。编程语言的兴替很快的,初学编程的爱好者未必要跟风,而且各个语言都有自己适合应用的领域,而且编写风格不一样,初学编程语言的,还是选自己看的顺眼,写着顺手的语言入门,学精通了,尤其先把计算思维培养起来,其他编程语言都是相通的。</p><p><br ></p><p>别小看计算思维,这个是编程的基础。来看看一道数学题引发的思考,就知道啥是计算思维了。</p><p><img src="https://nos.netease.com/edu-image/6276001c-c9cb-4c12-b9b2-1da17089a344.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>我的读书微信群里有大叔发了个算术题,本以为是脑筋急转弯,或者智力题。结果引发各路讨论。由于群里就3个理科生,多名文科生的脑回路,纯猜测,也是很欢脱的。</p><p>且看大叔出的题目如下:</p><p><br /></p><p><em>求答案 ?</em></p><p><em>一筐鸡蛋:</em></p><p><em>1个1个拿,正好拿完。</em></p><p><em>2个2个拿,还剩1个。</em></p><p><em>3个3个拿,正好拿完。</em></p><p><em>4个4个拿,还剩1个。</em></p><p><em>5个5个拿,还差1个。</em></p><p><em>6个6个拿,还剩3个。</em></p><p><em>7个7个拿,还差3个。</em></p><p><em>8个8个拿,还剩1个。</em></p><p><em>9个9个拿,正好拿完。</em></p><p><em>问筐里最少有多少鸡蛋?</em></p><p><em>能算出这道题的智商不一般!求答案 ?有高手没,算算吧!</em></p><p>&nbsp;</p><p>刚好看数学文化讲韩信点兵,《孙子算经》里面就有有物不知数问题。记得有个公式,直接套用。a,b,c 分别是3,5,7的余数,k为整数,带入求x</p><p>x=70a+21b+15c+105k &nbsp;a=0,b=1,c=3,k=0 得x=171。</p><p>&nbsp;</p><p>结果被大叔劈头盖脸一通说</p><p><img src="https://nos.netease.com/edu-image/74fea83a-2193-4dc1-9da4-5a8da43ec202.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>天啊撸,题目没审对,差和剩啊。[捂脸]充分说明语文没学好,解不了数学题啊。</p><p>&nbsp;</p><p>再算,结果还是不对,原来算经总结的公式是针对互质的素数计算的,也就是3,5,7取有余的情况。</p><p>所以<strong>数学公式的使用还是要看条件,不能想当然拿来主义。</strong></p><p>群里继续发散思维,除了叔提醒至少三位数,结尾是个9,大家都在蒙。</p><p>&nbsp;</p><p>然后开始歪楼了。</p><p><img src="https://nos.netease.com/edu-image/23986b56-a769-47ac-8a7f-e00c2b08b9d9.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>感受一下来自表格的暴击</p><p><br /></p><p>可惜结果还是错的。原因如我一样,没看清楚题!没看清楚题!没看清楚题!栽在了余1和差1上。</p><p>瞬间灵光一现,有电脑还笔算作甚?程序员是做啥的?</p><p>一段C暴力解决,没有循环解决不了的问题,有,那就再套个循环。</p><p>int count(int n)</p><p>{</p><p>&nbsp;&nbsp;&nbsp;&nbsp;int i = 1;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;for (i = 1; i &lt; n; i++)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;{</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i % 2 == 1 &amp;&amp; i % 3 == 0 &amp;&amp; i % 4 == 1 &amp;&amp; i % 5 == 4 &amp;&amp; i % 6 == 3 &amp;&amp; i % 7 == 4 &amp;&amp; i % 8 == 1 &amp;&amp; i % 9 == 0)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;return i;</p><p>}</p><p>输出结果:</p><p><img src="https://nos.netease.com/edu-image/250ceda8-cc58-440a-ae6c-873f6bc55bf7.png?imageView&thumbnail=520x520&quality=100" /></p><p><img src="https://nos.netease.com/edu-image/3c021cf7-5fb3-40be-9163-1caa7198d13d.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>修正条件后,表格版也算出来正确结果了。</p><p>可是,一道小学数学题,真的需要大动干戈吗?华丽丽地继续被大叔鄙视了。</p><p><img src="https://nos.netease.com/edu-image/c418dcff-e5f6-4667-95a7-fd182545e6e0.png?imageView&thumbnail=520x520&quality=100" /></p><p><img src="https://nos.netease.com/edu-image/3e8f6ec2-9335-4779-ab58-539055fc91f9.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>回想小学应用题,那也是无数个绞尽脑汁的思考过程。数学思维的训练,不做个万八的题还也真是没感觉。可惜工作久了,最熟悉的永远是手头现成的工具。</p><p>就说有计算器在手,你还能安心的用笔验算吗?还有编程久了,计算思维也逐渐取代了数学思维了。问你啥是汉诺塔是不是条件反射用迭代了?</p><p><img src="https://nos.netease.com/edu-image/5475c2f3-5aae-4282-aba9-b7a9df65dc6d.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>&nbsp;</p><p>看周以真给的概念可知。计算思维要运用计算机的基本概念求解问题,尽可能的仿真人脑思维。其实计算思维就是在不断建模训练,改变条件,求最优。而小学的数学思维是练习对问题的理解和分析能力,训练思考逻辑的,有很大的不同。一开始用程序语言解题的时候,容易带入数学思维。如果简单的公式可求解当然好,计算机=计算器。而复杂问题,数学模型无效,怎么办?就得转转念头。</p><p><img src="https://nos.netease.com/edu-image/c0fb0d02-4139-41ba-8ec0-9d9c5e821148.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>最难改的一个思维定势就是接受穷举这种暴力解题方式了。大家已经习惯解题都是固定解,或者答案也是有规律的设定。而编程要发挥计算机的计算能力,简单粗暴最容易解决问题,尤其在求初始范围的时候,随机数,穷举法这种无脑的方法都是很常用的。进一步细化模型,就需要关注的是边界和变化步长,精进算法来解题,无限逼近求得近似解。用计算机解题就要接受现实生活中的问题可能没有精确解的设定。</p><p>&nbsp;</p><p>所以培养计算思维第一步:<strong>学会使用循环语句实现穷举法解题。</strong></p><p>需要注意的就三点:</p><p><strong>⑴控制变量的初始化,有时候也包括种子值。</strong></p><p><strong>⑵循环的控制条件,或者跳出边界。</strong></p><p><strong>⑶循环变量的更新,仿真的话,指步长。</strong></p><p>而循环体是你要穷举来解决的问题核心内容,审好题实现就成。</p><p><img src="https://nos.netease.com/edu-image/edadae27-4286-4a25-b1b7-ddd0c279cf88.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>不论使用什么编程语言,都只是格式和关键字的差别,计算思维不变。懂得怎么想了,挑自己顺手的工具实现即可。</p><p>&nbsp;</p><p>有兴趣的朋友,欢迎给出表格实现的函数公式哦(中M有office的课程可以学学)。当然文中给的语句只是抛砖引玉,简单的演示如何穷举的,并不完备,有很大的精进空间。喜欢精修代码的,尽情发挥砸code吧。</p><p><br /></p><p>最后还是回归数学思维,打好基础。先要能看懂题目,再用工具才能锦上添花,不然再高级的算法,再高速的机器也解不开一道小学数学题的。</p><p><img src="https://nos.netease.com/edu-image/866593aa-5f27-4c22-820e-e87dc483bfbc.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>&nbsp;<br /></p><p>PS:给个解题思路,大家回忆一下小学里公倍数的计算方法吧。</p><p>题目略。</p><p>解题思路:4、5、8个拿差1个,5个5个拿还剩4个,则加1个是4、5、8的公倍数,即这个数是:40的倍数加1,</p><p>3、9个拿正好,2个拿余1个,6个拿余3个说明是9的倍数且是奇数,</p><p>那么这个数一定是40×9n+9=360n+9,</p><p>7个拿余5个,即去5后是7的倍数;</p><p>当n=1时,</p><p>360×1+9=369,此时除以7余数是5,</p><p>因此这个数是369.</p><p>答:筐里有369个鸡蛋.</p><p><br /></p><p>稍微思考的结论如下:</p><p><img src="https://nos.netease.com/edu-image/dc46ed27-050e-41df-9162-5eac78935ac4.jpg?imageView&thumbnail=520x520&quality=100" /></p><p>话说:我也想问问什么筐能放这么多鸡蛋?</p><p><br /></p><p>关于奇葩数学题的讨论可以再开帖子讨论了。也欢迎回复聊聊遇到过的奇葩数学题,抛出来,活跃一下大家的脑细胞,也是不错的。<br /></p><p><br /></p><p>好了,例子举完了,对于计算思维也有所了解了吧,那么学起来吧。</p><p><br /></p><p>首发公众号 <strong>DJ有时</strong> 有修改。</p><p><br /></p>
4 回复

    1楼

  • 周文扬 发表于2017年12月18日
    0 | 0 | 举报
    <p><br ></p><p>如果真是小学生的题目,应该数字不大,运用数字的整除特性法试试。</p><p>解:</p><p>2个2个拿,还剩1个。 是奇数<br >5个5个拿,还差1个。 即还剩4个,由于被5整除的数尾数是0或者5,那么这个数的尾数要么是4,要么是9。</p><p><span style="text-decoration: underline;" >由两者可知,这个数的尾数是9。</span></p><p><span style="text-decoration: underline;" ><br ></span></p><p>9个9个拿,正好拿完。 可知此数是9的倍数<br >结合前面结论和9的整除特性,可知这个数除尾数是9以外,其余位数的数字之和也是9。</p><p>(比如一个能被9整除的数189,1+8+9 =18 一定是9的倍数。当知尾数是9后,那前面两位之和1+8 一定是9的倍数。)</p><p><br ></p><p>到了这一步,基本就可开始猜数了。</p><p>先从个位数开始, 9,不符合7个7个拿还余3个,排除。</p><p>十位数,99,不符合4个4个拿,还剩1个,排除。</p><p>百位数:</p><p>189 ,不符合7个7个拿,还差3个。排除</p><p>279,不符合4个4个拿,还剩1个。排除</p><p>369,不符合7个7个拿,还差3个。排除&nbsp; 算到这里,感觉被楼主骗了,369不符合。</p><p><br ></p><p>既然开始了,硬着头皮也要算下去,万一这个数真是个三位数呢?</p><p>459,不符合4个4个拿,还剩1个。排除</p><p>549,不符合7个7个拿,还差3个。排除</p><p>639,不符合4个4个拿,还剩1个。排除</p><p>729,不符合7个7个拿,还差3个。排除</p><p>819,不符合4个4个拿,还剩1个。排除</p><p>999,不符合4个4个拿,还剩1个。排除</p><p><br ></p><p>彻底死心了。感觉又被出题人忽悠了,这哪是小学生的题,答案是千位数以上。那这种简单的排除法就不合适啦,得换种方法。</p><p></p>
    周文扬 发表于2017年12月18日
    添加评论
  • 2楼

  • 周文扬 发表于2017年12月18日
    1 | 0 | 举报
    <p>确实运用小学知识就可解决; 数字稍大了点。</p><p><br ></p><p>主要运用数字的整除特性和尾数法。</p><p>楼主文中有说到思路:尾数是9,且能被9整除,9n=**9&nbsp; 可知n的尾数必须是1</p><p>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *9</p><p>11,21,31.........91&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; *9</p><p>101,111,121&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; *9</p><p>在尝试到第13个数后,得到答案121*9=1089</p><p><br ></p><p></p>
    周文扬 发表于2017年12月18日
    添加评论
  • 3楼

  • 周文扬 发表于2017年12月18日
    0 | 0 | 举报
    <p>机械计算是计算机最擅长的事,让它从0开始穷举,根据已知条件该数是9的倍数减少其计算量。</p><p><br ></p><p>a= [ i for i in range(0,10000,9) if i % 2 == 1 &nbsp;and i % 4 == 1 and i % 5 == 4 and i % 6 == 3 and i % 7 == 4 and i % 8 == 1]<br >print (a)</p><p><br ></p><p>输出::</p><p>[1089, 3609, 6129, 8649]<br ></p>
    周文扬 发表于2017年12月18日
    添加评论
  • 4楼

  • 三皮小子 发表于2018年07月27日
    0 | 1 | 举报
    <p>都用穷举法了,那还研究算法干嘛。。。</p>
    三皮小子 发表于2018年07月27日
    • djfish 2018年07月30日
      0 | 举报
      <p>请看清题目:计算思维第一步。</p><p><br ></p>
      djfish 发表于2018年07月30日
      0 | 举报
    添加评论