在前段时间的学习中,遇到怎么判断一个数是否质数(素数),或者判断一个数是否是奇数的问题,在没有学习之前,我没有想到计算机是用什么样的方法实现的。我想原因在于人脑的思维和电脑的逻辑在很大程度上是不同的,人脑的思维是立体的,直观感觉电脑的逻辑是比较死板的,尽管她(付老说,计算机是大老婆,哈哈)在单纯计算方面和执行能力和准确率上都很有优势。比如,判断奇数,用n对2求余来实现,余数不为0则为奇数,否则不是。是或者不是也就是计算机所"思考"的true or false,其实两者是对立事件,用if判断很容易实现,而在其他情况下,不同分类之间也是严格的互斥,这也是if,else if,....,else的理论基础。比如,一个确定的数,要么是正数,要么是负数,要么是0。
说到质数的判断,感觉这个思维还是很有味道的,细细想来。我们的逻辑是观察,稍微有点数学基础,第一反应直观的就能看出来是或者不是,甚至能看出质因数来。而计算机是个很敬业的boy,他要很严谨地一个数一个数地去试,还是有顺序有套路的,这就产生了从2开始一直到n-1去除n(拟判定的值)的逻辑,如果在这个依次进行的过程中找到了一个数并且是第一个数能被n整除,就可以判定n是合数不是质数了,接下来他便不管了,事情做完了呀,看来他还很专业,多余的工作是没必要做的。如果没找到那最好,啥事没有,啪一个标签—质数。这样,n%i==0(i=2;i<n;i++)再来一个for循环就实现了质数判断。
那么问题来了,我们能判断是不是奇数或者质数的前提是该数最起码是个整数,而质数前提还要是正整数。是不是正数其实很好判断,如果n<=0便直接丢掉。那么是不是整数呢,我们之前没有接触到,怎么判断呢?
我想了很多办法,总觉得差那么一点。刚开始编程,其实并没有真正理解计算机的逻辑,更不能设身处地地给计算机输入一个他能听懂的指令或者待实现的想法。回头联想一下质数和奇数的实现过程,其实计算机很单纯很天真,看看下面这个语句n*10/10==0,my gold,这不就判定n是整数了么。一乘一除,以退为进,这真不是一个编程逻辑小白能想到的,人脑一般也不是这样思考问题的。下面我们再来看一个的数字问题的呈现过程。
求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+n。
代码简介明了却是意味深长,仔细想想是不是很有意思呢,亲测可行哦(输出计算式的代码没有写上去,也不是本文讨论的重点)。当然实现的方法有很多种,我们不妨运用一下我们的数学知识,先将这个数列做个分析计算,不难得出:当n是偶数时,和sum=-n/2;当n是奇数时,sum=(n+1)/2。下面看看实现代码和运行结果:
同样也是可行的。接下来我们比较一下这两种思路哪个更优秀呢?
显然第二种思路是更接近我们人脑的一种分析方法,这也使得这种方法对于编程来说显得很暴力,计算机在实现过程中只起到输出也就是显示器的作用,并没有将他强大的计算能力发挥出来,因为真正的计算和思考我们已经代劳了。所以接下来我们应该更倾向于第一种方法的逻辑,尝试用计算机的"思维"去解决实际的问题。
本贴权且写到这里,关于更多的数字的问题,下一篇会举到更多的一些例子,细加品尝也非常的有趣。