案例描述

哥德巴赫(Goldbach C.)是 17 世纪德国著名数学家,它层提出一个猜想:任一大于 2 的偶数都可写成两

个质数之和。比如偶数 6 可以写成质数 3 和质数 3 的和;偶数 18 可以写成质数 7 和质数 11 的和。

人们用大量的偶数进行试验,都没有反例可以驳倒哥德巴赫猜想,所以大家公认为这个猜想是正确的。但从

17 世纪哥德巴赫提出这个猜想开始,虽然有非常多的数学家尝试证明这个猜想,但是直到今天都没有任何人成

功。所以哥德巴赫猜想不能称为“定理”而只是一个“猜想”。

的确,哥德巴赫猜想的证明是非常难的,科学界上有一句话:“数学的皇冠是数论,而哥德巴赫猜想则是皇

冠上的明珠”。很多数学家都研究过哥德巴赫猜想的证明,而最接近证明结果的是我国著名数学家陈景润。程景

润在 1973 年发表了著名论文《大偶数表为一个素数与不超过两个素数乘积之和》(即“1+2”),把几百年来

人们未曾解决的哥德巴赫猜想的证明大大推进了一步,引起轰动,在国际上被命名为“陈氏定理”。他有着超人

的勤奋和顽强的毅力,多年来孜孜不倦地致力于数学研究,废寝忘食,每天工作 12 个小时以上。在遭受疾病折

磨时,他都没有停止过自己的追求,为数学事业的发展作出了重大贡献。他的事迹和拼搏献身的精神在全国各地广为传颂,成为一代又一代青少年心目中传奇式的人物和学习楷模。

我们今天来编写程序:用户输入一个偶数,控制台输出这个偶数所有能够被拆分为的质数和形式。

比如用户输入 26,控制台显示“3 + 23”、“7 + 19”、“13 + 13”,这是数字 26 所有能够能够被拆

分的质数和形式。

案例分析

分析程序的时候,常用的方法就是先思考一个具体的数字,在脑中将整个流程想一遍,然后再思考更多数字

的情况。

我们先思考:比如用户输入数字 26,我们要做什么呢?

此时要做的事情很简单,就是从 2 开始(2 是最小的质数),到这个数字的一半结束(这个数字的一半是最

大的拆分可能),一个一个的去实验,看看被拆分的两个数字是不是质数,如果是就输出它们的结果。思路如下:

26 等于 2 + 24,检查 2 是不是质数,24 是不是质数,如果都是,则输出这组结果;

26 等于 3 + 23,检查 3 是不是质数,23 是不是质数,如果都是,则输出这组结果;

26 等于 4 + 22,检查 4 是不是质数,22 是不是质数,如果都是,则输出这组结果;

……

26 等于 13 + 13,检查 13 是不是质数,13 是不是质数,如果都是,则输出这组结果。

可见,当用户输入偶数 n 的时候,我们需要书写循环语句,引导循环变量 i 从 2 到 n / 2 遍历,分别检查

i 和 n-i 是不是质数。即,我们需要大量检查一个数字是不是质数,所以可以将检查一个数字是不是质数的功能

封装为一个函数,这将大大简化程序的编写难度。

检查一个数字是不是质数,这个函数非常好写。比如检查数字 a 是不是质数,只需要从 1 开始到 a 结束依

次除 a,统计能够整除的数字个数。如果能够整除的数字个数是 2,表示只有 1 和它本身两个因数,这个数字就

是质数。根据这个思路,我们写出下面这个函数:

//判断数字是否是质数

function isPrimeNumber(a){

//统计 a 的约数个数

for(var i = 1 , count = 0; i <= a ; i++){

if(a % i == 0){

count ++;

}

}

//如果仅有 2 个因数,表示这个数字是质数,反之不是。

return count == 2;

}

这个函数的算法效率不高,比如判断数字 14 是不是质数,遍历到 2 的时候因为 2 能够整除 14,此时就已经

能够判断 14 不是质数了,而不用再遍历 3、4、5……了。

事实上,函数 return 语句会立即结束函数的这个特点,通常可以简化函数。这个函数的算法思路可以改为:

从 2 开始到 a-1 结束,依次去除 a,如果这个数字能除尽 a,则 return false。遍历完没有发现能够整除 a 的

数字,则 return true。改进的函数写法如下:

//判断数字是否是质数

function isPrimeNumber(a){

for(var i = 2 ; i < a ; i++){

if(a % i == 0) return false;

}

return true;

}

可见,JavaScript 中要充分能利用 return 语句,提升程序效率。

书写完这个函数之后,要立即测试函数,这种对某个小函数的测试叫做“单元测试”。我们在 REPL 环境中

调用函数多次,测试了几个不同的数字,都返回了正确的结果,说明函数是正确的

有了 isPrimeNumber 函数之后,我们就能够轻松实现哥德巴赫猜想题目的要求了。