质数分解

合集下载

质数 合数 分解质因数

质数 合数 分解质因数

质数合数分解质因数在自然数中,一个数除1和它本身,不再有别的约数,这个数叫做质数,也叫做素数.例如2,3,5,7,11,……都是质数.一个数除了1和它本身,还有别的约数,这个数叫做合数.例如4,6,8,9,12,……都是合数.1既不是质数,也不是合数.这样,自然数在按约数个数分类,可以分成:质数、合数和1.偶数中只有2是质数,而且是全部质数中最小的一个.除2以外全部的偶数都是合数,除2以外全部的质数都是奇数.每个合数都可以写成几个质数相乘的形式,这几个质数就叫做这个合数的质因数.例如,因为70=2&215;5&215;7,所以2,5,7是70的质因数.把一个合数用质数相乘的形式表示出来,叫做分解质因数.例如,60=2&215;2&215;3&215;5=22&215;3&215;5,把60这个合数用2&215;2&215;3&215;5或22&215;3&215;5的形式来表示,就是把60分解质因数.例1 两个质数的积是46,求这两个质数的和.分析:两个质数的积是46,46是偶数,只能是一个奇质数与一个偶质数的积,而偶质数只有2,因此很简单得出其它的质数,从而问题得以解决.解:因为46是偶数,因此它必是一个奇质数与一个偶质数的积,而偶质数只有2,另一质数46&247;2=23,所以2与23的和为25.例2 用2,3,4,5中的三个数能组成哪些三位质数?分析:首先考虑个位数字是几,如果个位数字是2或4,这样的三位数必能被2整除,因此这样的三位数不会是质数,如果个位数字是5,这样的三位数必能被5整除,这样的三位数也不会是质数,所以个位数字只能是3,再由剩下的三个数字组成百位、十位,得出个位数字是3的三位数为:243,423,253,523,453,543,最后依据质数的推断方法,得到所求的质数.解:如果组成的三位数的个位数字是2、4、5时,这个数必能被2或5整除,因此个位数字只能是3,而个位数字是3的三位数有243,423,253,523,453,543,其中243,423,453,543均能被3整除,253能被11整除,所以只有523是质数.质数的推断方法是,当一个数比拟小时,用定义直接推断,但这个数比拟大时,通常采纳查质数表,最好记住100以内的全部质数.在没有质数表的情况下,可以用质数从小到大的顺序逐个地去试除.如果能被其中某一个质数整除,就说明这个数是合数,如果除到商已比试除的质数小,还不能被这些质数中的任何一个整除,那么这个数肯定是质数.例如,推断100以内的数是否是质数,只需用2、3、5、7这四个质数去试除,如果没有一个能整除它,这个数肯定是质数,否则不是质数.推断97是不是质数,因为97不能被2,3,5,7中的任何一个整除,因此97是质数.为什么不必去试除比97小的全部的质数呢?因为97不能被2,3,5,7中的任何一个整除,它就肯定不能被4,6,8,9,10等数〔分别为2,3,5的倍数〕整除,又因为,如果用11或大于11的质数去试除, 97&247;11=8…9,97&247;13=7…6,其商为8、7,比除数还小,都已试除过,因此推断100以内的数是否是质数只需用2,3,5,7去试除.推断200以内的数是否是质数,只需用2,3,5,7,11,13,17这七个质数去试除;推断300以内的质数,只需用2到17这七个质数去试除;推断400以内的质数,只需用20以内的八个质数与去试除;推断500以内的质数,只需2到23的质数去试除.其余可用类似的方法推出,你可以思考一下1000以内的质数如何推断?例3 将40,44,45,63,65,78,99,105这八个数平分成两组,使每组四个数的乘积相等.分析:如果采纳观察、计算调整的方法是比拟麻烦的.要使两组数的乘积相等,只有两组数中的质因数相同,而且质因数的个数也相同,就可以了,所以从这八个数分解质因数入手,依据各质因数的个数,进行适当的搭配,便能找出问题的答案.解:将八个数分解成质因数:40=23&215;5 44=22&215;1145=32&215;5 63=32&215;765=5&215;13 78=2&215;3&215;1399=32&215;11 105=3&215;5&215;7这八个数分解质因数后一共有6个2,8个3,4个5,2个7,2个11,2个13.因此,这八个数被分成两组后,每一组应含有3个2,4个3,2个5,1个7,1个11,1个13,这样可以得到两组分别为:40,63,65,99和44,45,78,105.例4 360有多少个约数?分析:如果先求360的全部约数,再数出它们的个数,显然比拟麻烦.为此,先将360分解质因数:360=23&215;32&215;5,360的任意一个约数均由假设干个2或3或5组成,我们将360的全部约数列成下面的数阵:1 2 22 233 2&215;3 22&215;3 23&215;332 2&215;32 22&215;32 23&215;325 2&215;5 22&215;5 23&215;53&215;5 2&215;3&215;5 22&215;3&215;5 23&215;3&215;532&215;52&215;32&215;522&215;32&215;5 23&215;32&215;5这个数阵共6行,每行4个约数,所以360共有4&215;6=24个,而24=〔3+1〕&215;〔2+1〕&215;〔1+1〕,这里3,2,1恰好是360分解质数式子中2,3,5的个数,从而得到下面关于约数个数的一个重要结论:一个大于1的整数的约数个数,等于它的质因数分解式中每个质因数的个数加1的连乘积.用数字式子表示为:如果A分解质因数为:则A的全体约数的个数为:〔r1+1〕&215;〔r2+1〕&215;…&215;〔rn+1〕例5 有30个约数的最小自然数是多少?分析:设所求的数为A,则A有30个约数,因为30= 30&215;1=2&215;15=6&215;5=10&215;3=2&215;3&215;5,要使A最小,一般使A的质因数的幂指数尽可能小,质因数的个数尽可能少,所以A必为以下形式:其中a1,a2,a3为互不相同的质数.要使A最小,a1,a2,a3尽可能小,显然a3=2,a2=3,a1=5,这样A=24&215;32&215;5=720解:因为30=30&215;1=2&215;15=6&215;5=10&215;3=2&215;3&215;5,而且题中要求a2、a3为互不相等的质数,为了使A最小,a3=2,a2=3,a1=5,所以A=24&215;32&215;5=720.例6 九个连续自然数中至多有四个质数,例如1至9中有2、3、5、7四个质数.请在200以内再找出五组这样的质数.分析:9个连续自然数中至多有5个奇数.在两位数中,个位是5的数必能被5整除,而且三个连续的奇数必有一个能被3整除,所以只有当个位数字为5的两位数又能被3整除时,其余的四个奇数才有可能是质数.当找到一组这样的两位以上的质数时,另一组与这组对应的数的差必定是30的倍数.按照上述方法找出后,再依据质数的推断方法去筛选就可得出结果.首先简单得出3,5,7,11;5,7,11,13;在两位数中,按照上面的方法可得出以下各组数:11,13,15,17,19;41,43,45,47,49;71,73,75,77,79;101,103,105,107,109;131,133,135,137,139;161,163,165,167,169;191,193,195,197,199;依据质数的推断方法可以得出两位数中还有11,13,17,19;101,103,107,109;191,193,197,199这三组符合条件.解:200以内其它五组这样的质数为:3,5,7,11;5,7,11,13;11,13,17,19;101,103,107,109;191,193,197,199.。

分解质因数的格式

分解质因数的格式

分解质因数的格式分解质因数是将一个大于1的正整数,分解成若干个质数相乘的形式。

其格式通常为:将待分解的正整数写成一个算式,形式为:n = p1^a1 * p2^a2 * …* pn^an其中,p1、p2、…、pn是质数,a1、a2、…、an是正整数,且a1、a2、…、an≥1。

接下来,我们需要逐个确定每个质数的指数。

具体步骤如下:1. 首先,我们可以列举出所有小于或等于n的质数。

2. 从小到大依次取出每个质数,判断它是否是n的因数。

3. 若该质数是n的因数,则记录下它的指数,并将n除以该质数,得到一个新的正整数。

4. 重复步骤2和步骤3,直到n无法再分解为质数相乘的形式为止。

5. 最后,将所有质数和它们的指数写成一个算式,即为分解质因数的结果。

例如,将正整数48分解成质数相乘的形式,可以按照如下步骤进行:1. 列举出小于或等于48的质数:2、3、5、7、11、13、17、19、23、29、31、37、41、43、47。

2. 从小到大依次取出每个质数,判断它是否是48的因数。

首先,2是48的因数,因为48÷2=24。

因此,我们记录下2的指数为1,将48除以2得到24。

3. 接着,2仍然是24的因数,因为24÷2=12。

同样地,我们记录下2的指数为2,将24除以2得到12。

4. 继续用2去除12,得到6。

此时,2不再是6的因数,因此我们转而用下一个质数3去尝试。

由于6÷3=2,3是6的因数,因此我们记录下3的指数为1,将6除以3得到2。

5. 由于2不是质数,我们继续用下一个质数5去尝试。

由于2除以5余数不为0,因此5不是48的因数。

同理,7、11、13、17、19、23、29、31、37、41、43、47均不是48的因数。

6. 最后,我们得到48=2^4 * 3^1。

因此,分解质因数的结果为48 = 2^4 * 3^1。

常见的质因数分解-概述说明以及解释

常见的质因数分解-概述说明以及解释

常见的质因数分解-概述说明以及解释1.引言1.1 概述概述部分旨在对质因数分解进行简要介绍,向读者展示本文的主题和重要性。

质因数分解是数学中的一项基本概念,用于将一个数分解为若干个质数的乘积。

它在数论、代数、密码学等领域起着至关重要的作用。

质因数分解不仅是数学的基础知识,也是其他数学问题的关键步骤。

本文将重点介绍质因数的定义和性质,质因数分解的基本概念,以及常见的质因数分解方法。

它将帮助读者深入理解质因数分解的原理和应用,为解决相应的数学问题提供有力支持。

通过学习质因数分解,读者将能够更好地理解数的性质,掌握求解问题的方法,拓宽数学思维和解决问题的能力。

在正文部分,我们将详细介绍质因数的定义和性质,包括质数的概念以及如何判断一个数是否为质数。

随后,我们将解释质因数分解的基本概念,说明为什么我们可以将一个数分解为质数的乘积。

最后,我们将介绍一些常见的质因数分解方法,包括试除法、分解素因子法等。

本文的结论部分将对常见的质因数分解方法进行总结,并探讨质因数分解在实际应用中的价值。

我们将讨论质因数分解的应用领域,例如在密码学中的应用,以及对质因数分解未来发展的展望。

通过阅读本文,读者将获得对质因数分解的全面了解,了解其在数学中的重要性和广泛应用。

希望本文能为读者带来启发,激发对质因数分解以及相关数学问题的兴趣,并为进一步学习和研究提供基础知识。

文章结构部分的内容如下:1.2 文章结构本文按照以下结构进行组织和撰写:1. 引言:介绍质因数分解的背景和重要性,概括质因数分解在数学中的应用领域。

同时,说明本文的目的和重点。

2. 正文:主要包括三个部分。

2.1 质因数的定义和性质:介绍质因数的基本概念和性质,包括质因数的定义、质因数与合数的区别、质因数的唯一性等。

2.2 质因数分解的基本概念:详细解释质因数分解的概念和原理,讲解如何将一个数分解为若干个质数的乘积,以及质因数分解的唯一性。

2.3 常见的质因数分解方法:介绍常用的质因数分解方法,包括试除法、分解定理、辗转相除法等。

质数合数分解质因数

质数合数分解质因数

(七)质数合数分解质因数闵识要点]若a能被b養除,b就是a的约数。

1. 质数与合数自然数按其约数的个数可以分成三类:⑴单位1:只含有1这一个约数的自然数。

⑵质数(也称为素数):只含有1与它本身这两个约数的自然数。

(质数有无穷多个,不存在最大的质数,但有最小的质数2,而且2履质数中唯一的偶数。

100之内有25个质数。

)(3)合数:含有三个或三个以上约数的自然数。

2. 分解质因数:把一个合数用质因数相乘的形式表示出来,叫做分解质因数。

如:12 = 2X2X3;70 = 2X5X7; 126 = 2X3X3X7; ............................若校大的自然数要进行分解质因数往往用短除法。

练习:把21六、107八、504()写成质因数连乘的形式:例 1 :a、b、c 是质数,c 是一名数,且aXb+c=1993o 那么a+b+c=()。

例2:用一.二、3、4、五、六、7、八、9这九个数字组成质数, 若是每一个数字都要用到,而且只能用一次,那么这九个数字最多能1组成多少个质数?例3: 1500的约数有()个。

这些约数的和是()。

例4:有8个不同约数的自然数中,最小的一个是()。

例5: 504乘以一个自然数a,取得一个平方数,求a的最小值和这个平方数。

练习:1.36()的约数有 __ 个,这些约数的和是________ 。

2.找出1992所有不同的的质因数,它们的和是 ______ o3.若a、b、c、d是四个互不相等的自然数,且aXbXcXd= 1988,那么a+b+c+d的最大值是 ______ 。

24.3780乘以一个自然数的积是一个完全平方数,这个自然数最小是______ o5.在有12个约数的自然数中,最小的一个是______ o6.四个小于1()的自然数,它们的积是360。

已知这四个数中只有一个是合数,那么这四个数别离是_______ O7.在下面的算式里,四个小纸片各盖住一个数字,被盖住的四个数字之和是____ O□ 口X □□19 9 28.31-( )=( )余7,要在算式的括号内填入适当的数使等式成立,共有______ 种不同的填法。

分解质因数的概念

分解质因数的概念

分解质因数的概念质因数分解,又称因式分解,是以某个自然数的乘积表达式等于该自然数的分解过程,也可以称之为“根因数分解”。

它是把一个自然数分解成多个不同的质数的乘积,一般质因数分解的结果称之为“因式分解式”,也有人称其为“质数分解”。

一、什么是质因数分解?质因数分解,是把一个大的数字分解成多个小的数字的相乘结果,也就是把一个大的数由它等于它的因数乘积来表示。

它是把一个自然数分解成多个不同的质数的乘积,如把35分解为:5*7=35,5和7都是质数,因此叫质因数分解。

二、质因数分解的好处1、便于解决各种算术问题。

把一个大的数字分解成多个小的数字,有助于我们从数学角度对问题进行研究,甚至为算术问题提供解决方案。

2、降低难度。

质因数分解可以把抽象的大数字转化为可操作的小数字,可以帮助我们减少算术的困难度,同时也有助于我们更加快速的计算出正确的结果。

3、节省时间。

质因数分解可以大大提高计算效率,比如对35进行质因数分解,当然我们可以逐位相乘,但是根据惯例识别出质素5和7,然后乘起来明显比逐位相乘要快得多。

4、培养思维。

质因数分解可以锻炼我们的智力能力,比较分析数的类型及分解数,可以帮助培养孩子的辩证思维能力和空间思维能力。

三、如何快速进行质因数分解?1、从大到小,把每一位数都乘一遍,乘出正确的结果及时止步。

2、观察每一位数,发现有数字可以分出质数,分解质数,继续乘下去。

3、若有比较大的数,就分解位数最大的质数,绳进行逐步分解。

4、经验一:任何一个自然数除以2和3以外的质数都可以分解成质因数;5、经验二:任何一个自然数都可以分解成小于等于它平方根的质因数的乘积。

总之,质因数分解是一个智力活动,不要急躁,分析数字,仔细思考,就可以得出结果。

虽然有经验,但是也要谨记这些经验,把它与自己的实际操作结合起来,才能形成有用的思路,从而高效的解决问题,而不会失误。

分解质因数的方法

分解质因数的方法

分解质因数的方法
分解质因数是数学中的一个重要概念,用于将一个大于1的正整数分解为几个质数的乘积。

下面我们来介绍一种常用的方法。

首先,我们需要找出这个正整数的最小质因数。

最小质因数是指大于1且能够整除这个正整数的最小质数。

我们可以从2开始逐个测试,直到找到一个能够整除的质数。

找到最小质因数后,我们将这个质数写在第一行,然后将原正整数除以这个质数得到的商写在下一行。

接下来,我们对得到的商重复上述步骤,找到新的最小质因数并写在第一行,然后将新的商写在下一行。

我们继续这个过程,直到得到的商为1。

此时,第一行上写的
所有质数即为原正整数的所有质因数。

例如,对于正整数48,我们可以按照上述方法进行分解质因数:
48 ÷ 2 = 24
24 ÷ 2 = 12
12 ÷ 2 = 6
6 ÷ 2 = 3
3 ÷ 3 = 1
所以,48的质因数分解为 2 × 2 × 2 × 2 × 3 = 2^4 × 3。

这就是一种常用的分解质因数的方法。

希望对你有帮助!。

如何进行高中数学质因数分解

如何进行高中数学质因数分解

如何进行高中数学质因数分解数学是一门需要深入思考和不断练习的学科,而数学中的质因数分解是一项非常基础的技能。

在各种数学题目中,质因数分解都有着非常显著且实用的应用价值。

如何进行高中数学质因数分解成了学生们必须要掌握的数学技能之一。

下面我们将介绍一些质因数分解的基础知识和方法。

一、什么是质因数质因数是指一个正整数中,除了1和它本身外不能被其他的正整数整除的因数。

举个例子,数字6可以被2、3和6整除,因此它的因数为1、2、3和6。

但是只有2和3是质数,所以6的质因数为2和3。

二、质因数分解的意义质因数分解可以将一个正整数表示为若干个质数的乘积的形式,而这个表达式是唯一的。

这种表达方式不仅可以帮助人们更好地理解数的性质,还可以用于计算和解决数学问题,如求最大公因子、最小公倍数等。

三、质因数分解的方法1.试除法试除法是一种简单而有效的质因数分解方法。

首先,我们假设要分解的整数为n,然后从最小的质数2开始,逐个测试n是否能被2整除,如果能,就将n除以2,得到的商继续测试是否能被2整除,直到不能被2整除为止。

接着,我们将测试下一个质数3,重复上述过程直到质数大于n的平方根为止。

最后,如果n大于1,则剩下的数字也是一个质因数。

例如,将数字60分解质因数,我们可以先测试2是否能整除它,得到商30;接着,我们测试2是否能整除30,发现不能,所以我们测试3是否能整除它,得到商10;然后我们测试3是否能整除10,还是不能,接下来我们测试5是否能整除它,得到商2,继续测试5不能整除2,所以60的质因数是2、2、3、5。

2.倍增法倍增法是一种优化后的试除法。

它借鉴了二分查找算法的思想。

我们从2开始,每次将当前的质数加倍,测试所得的结果是否能整除待分解的整数n。

如果不能整除,则将当前质数加倍后再次测试。

如果当前质数的平方超过了n,那么n就是一个质数。

这种方法的时间复杂度要比试除法低得多。

例如,将数字60分解质因数,我们可以先从2开始,将其加倍得到4,测试4是否能整除60,不能,再将4加倍得到8,测试8是否能整除60,不能,但是8的平方超过60了,所以不能再进行测试,之前的质数即2、2、3、5是60的质因数。

分解质因数的方法与应用

分解质因数的方法与应用

分解质因数的方法与应用分解质因数是数论中的一个重要概念,它可以帮助我们将一个数分解成若干个质数的乘积。

在数学和实际应用中,对数字进行质因数分解有着重要的意义。

本文将介绍分解质因数的一般方法,并探讨其在数学和实际生活中的应用。

一、分解质因数的方法分解质因数的方法有多种,下面将介绍常用的两种方法:试除法和列举法。

试除法是最常见的分解质因数的方法之一。

它的基本思想是从最小的质数开始,依次试除待分解的数,将其分解成若干个质数的乘积。

具体步骤如下:1. 首先,从最小的质数2开始,将待分解的数除以2,如果能够整除,则2为其质因数之一,同时将得到的商作为新的待分解的数继续进行试除;2. 如果不整除,则试除下一个质数,即3,以此类推;3. 重复以上步骤,直到无法再整除为止。

列举法是另一种分解质因数的方法。

它通过列举出待分解数的所有质数因子,并按照从小到大的顺序排列,得到质因数分解式。

具体步骤如下:1. 首先,从最小的质数2开始,判断待分解的数是否能够被2整除;2. 如果能整除,则2为其质因数之一,同时将得到的商作为新的待分解的数继续进行判断;3. 如果不能整除,则试除下一个质数,即3,以此类推;4. 重复以上步骤,直到待分解的数变为1为止。

二、分解质因数的应用分解质因数在数学中有着广泛的应用,下面将介绍分解质因数在素数判断、最大公约数和最小公倍数计算以及 RSA 加密算法中的应用。

1. 素数判断:分解质因数可以帮助我们判断一个数是否为素数。

如果一个数被分解成两个以上的质数,那么它就不是素数,否则,就是素数。

2. 最大公约数和最小公倍数计算:分解质因数可以方便地求解两个数的最大公约数和最小公倍数。

通过将两个数分别分解质因数并找出共有的质因数,可以求得它们的最大公约数;相反地,将两个数的质因数乘积除以最大公约数,即可求得最小公倍数。

3. RSA 加密算法:RSA 加密算法是目前最常用的非对称加密算法之一。

该算法的关键在于两个大质数的运算,而分解质因数是 RSA 加密算法的难题之一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

★引子前天,俺在《俺的招聘经验[4]:通过笔试答题能看出啥?》一文,以"求质数"作为例子,介绍了一些考察应聘者的经验。

由于本文没有政治敏感内容,顺便就转贴到俺在CSDN 的镜像博客。

昨天,某个CSDN网友在留言中写道:老实说,这个程序并不好写,除非你背过这段代码如果只在纸上让别人写程序,很多人都会出错但是如果给一台电脑,大多数人都会把这个程序调试正确出这个题目没啥意义只能让别人觉得你出题水平低首先,这位网友看帖可能不太仔细。

俺在文中已经专门强调过了,评判笔试答题,"思路和想法"远远比"对错"更重要,而他/她依然纠结于对错;其次,这位网友居然觉得这道题目没啥意义,这让俺情何以堪啊?!看来,有相当一部分网友完全没有领略到此中之奥妙啊!算了,俺今天就豁出去了,给大伙儿抖一抖这道题目的包袱。

当然,抖包袱的后果就是:从今天开始,就得把"求质数"这道题从俺公司的笔试题中去掉,然后换上另外一道全然不同的。

这么好的一道题要拿掉,真是于心不忍啊 :-(★题目好,言归正传。

下面俺就由浅入深,从各种角度来剖析这道题目的奥妙。

为了避免被人指责为"玩文字游戏"(有些同学自己审题不细,却抱怨出题的人玩文字游戏),在介绍各种境界之前,再明确一下题意。

前一个帖子已经介绍过,求质数可以有如下2种玩法。

◇需求1请实现一个函数,对于给定的整型参数 N,该函数能够把自然数中,小于 N 的质数,从小到大打印出来。

比如,当 N = 10,则打印出2 3 5 7◇需求2请实现一个函数,对于给定的整型参数 N,该函数能够从小到大,依次打印出自然数中最小的 N 个质数。

比如,当 N = 10,则打印出2 3 5 7 11 13 17 19 23 29★试除法首先要介绍的,当然非"试除法"莫属啦。

考虑到有些读者是菜鸟,稍微解释一下。

"试除",顾名思义,就是不断地尝试能否整除。

比如要判断自然数 x 是否质数,就不断尝试小于 x 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是质数。

显然,试除法是最容易想到的思路。

不客气地说,也是最平庸的思路。

不过捏,这个最平庸的思路,居然也有好多种境界。

大伙儿请看:◇境界1在试除法中,最最土的做法,就是:假设要判断 x 是否为质数,就从 2 一直尝试到 x-1。

这种做法,其效率应该是最差的。

如果这道题目有10分,按照这种方式做出的代码,即便正确无误,俺也只给1分。

◇境界2稍微聪明一点点的程序猿,会想:x 如果有(除了自身以外的)质因数,那肯定会小于等于 x/2,所以捏,他们就从 2 一直尝试到 x/2 即可。

这一下子就少了一半的工作量哦,但依然是很笨的办法。

打分的话,即便代码正确也只有2分◇境界3再稍微聪明一点的程序猿,会想了:除了2以外,所有可能的质因数都是奇数。

所以,他们就先尝试 2,然后再尝试从 3 开始一直到 x/2 的所有奇数。

这一下子,工作量又少了一半哦。

但是,俺不得不说,依然很土。

就算代码完全正确也只能得3分。

◇境界4比前3种程序猿更聪明的,就会发现:其实只要从 2 一直尝试到√x,就可以了。

估计有些网友想不通了,为什么只要到√x 即可?简单解释一下:因数都是成对出现的。

比如,100的因数有:1和100,2和50,4和25,5和20,10和10。

看出来没有?成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。

至于严密的数学证明,用小学数学知识就可以搞定,俺就不啰嗦了。

◇境界5那么,如果先尝试2,然后再针对 3 到√x 的所有奇数进行试除,是不是就足够优了捏?答案显然是否定的嘛?写到这里,才刚开始热身哦。

一些更加聪明的程序猿,会发现一个问题:尝试从 3 到√x 的所有奇数,还是有些浪费。

比如要判断101是否质数,101的根号取整后是10,那么,按照境界4,需要尝试的奇数分别是:3,5,7,9。

但是你发现没有,对9的尝试是多余的。

不能被3整除,必然不能被9整除......顺着这个思路走下去,这些程序猿就会发现:其实,只要尝试小于√x 的质数即可。

而这些质数,恰好前面已经算出来了(是不是觉得很妙?)。

所以,处于这种境界的程序猿,会把已经算出的质数,先保存起来,然后用于后续的试除,效率就大大提高了。

顺便说一下,这就是算法理论中经常提到的:以空间换时间。

◇补充说明开头的4种境界,基本上是依次递进的。

不过,境界5跟境界4,是平级的。

在俺考察过的应聘者中,有人想到了境界4但没有想到境界5;反之,也有人想到境界5但没想到境界4。

通常,这两种境界只要能想到其中之一,俺会给5-7分;如果两种都想到了,俺会给8-10分。

对于俺要招的"初级软件工程师"的岗位,能同时想到境界4和境界5,应该就可以了。

如果你对自己要求不高,仅仅满足于浅尝辄止。

那么,看到这儿,你就可以打住了,无需再看后续的内容;反之,如果你比较好奇或者希望再多学点东西,请接着往下看。

★筛法说完"试除法",再来说说筛法(维基百科的解释在"这里")。

俺不妨揣测一下:本文的读者,应该有2/3以上,从来没有听说过筛法。

所以捏,顺便跟大伙儿扯扯蛋,聊一下筛法的渊源。

这个筛法啊,真的是一个既巧妙又快速的求质数方法。

其发明人是公元前250年左右的一位希腊大牛——埃拉托斯特尼。

为啥说他是大牛捏?因为他本人精通多个学科和领域,至少包括:数学、天文学、地理学(地理学这个词汇,就是他创立的)、历史学、文学(他是一个诗人)。

真的堪称"跨领域的大牛"。

他最让俺佩服的是:仅仅用简单的几何方法,测量出了地球的周长、地球与月亮的距离、地球与太阳的距离、赤道与黄道的夹角......而且,这些计算结果跟当代科学家测出的,相差无几。

要知道他生活的年代,大概相当于中国的春秋战国。

而咱们的老祖宗,一直到明朝还顽固地坚信:天是圆的、地是方的、月亮会被天狗给吃喽......好了,扯蛋完毕,言归正传。

估计很多人把筛法仅仅看成是一种具体的方法。

其实,筛法还是一种很普适的思想。

在处理很多复杂问题的时候,都可以看到筛法的影子。

那么,筛法如何求质数捏,说起来很简单:首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数......上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。

维基百科上有一张很形象的动画,能直观地体现出筛法的工作过程。

明白了"筛法"的原理,大伙儿应该看出,筛法在速度上是明显优于"试除法"的。

当然,筛法的程序实现也分为不同的境界。

而且,筛法可讲究的门道更多了。

下面,俺分别从不同角度,聊一聊筛法都有哪些讲究。

◇如何确定质数的分布范围?这是采用筛法首先会碰到的问题。

文本开头给出的那两种需求,其处理的方式完全不同,俺分别说一下。

需求1对于需求1,这个自然不是问题。

因为在需求1中,质数的分布范围就是 N,已经给出了,很好办。

需求2但是对于需求2,就难办了。

因为需求2给出的 N,表示需要打印的质数的个数,那么这 N 个质数会分布在多大的范围捏?这可是个头疼的问题啊。

但是,来应聘的程序猿如果足够牛的话,当然不会被这个问题难倒。

因为素数的分布,是有规律可循滴——这就是大名鼎鼎的素数定理。

稍微懂点数学的,应该知道素数的分布是越往后越稀疏。

或者说,素数的密度是越来越低。

而素数定理,说白了就是数学家找到了一些公式,用来估计某个范围内的素数,大概有几个。

在这些公式中,最简洁的就是 x/ln(x),公式中的 ln 表示自然对数(估计很多同学已经忘了啥叫自然对数)。

假设要估计1,000,000以内有多少质数,用该公式算出是72,382个,而实际有78,498个,误差约8个百分点。

该公式的特点是:估算的范围越大,偏差率越小。

有了素数定理,就可以根据要打印的质数个数,反推出这些质数分布在多大的范围内。

因为这个质数分布公式有一定的误差(通常小于15%)。

为了保险起见,把反推出的素数分布范围再稍微扩大15%,应该就足够了。

可能有同学会质疑俺:谁有这么好的记性,能够在笔试过程中背出这些质数分布公式捏?俺觉得:背不出来是正常滴。

但是,对于有一定数学功底的应聘者,假如他/她知道质数分布公式,即便不能完整写出来,只要在答题中体现出:"此处通过质数分布公式推算范围",那么俺也是认可滴。

再啰嗦一次:关键是看idea!◇如何设计存储容器?知道了分布范围,接下来就得构造一个容器,来存储该范围内的所有自然数;然后在筛的过程中,把合数筛掉。

那么,这个容器该如何设计捏?不同层次的程序猿,自然设计出来的容器也不同啦。

境界1照例先说说最土的搞法——直接构造一个整型的容器。

在筛的过程中把发现的合数删除掉,最后容器中就只剩下质数了。

为啥说这种搞法最土捏?首先,整型的容器,浪费内存空间。

比方说,你用的是32位的C/C++或者是Java,那么每个 int 都至少用掉4个字节的内存。

当 N 很大时,内存开销就成问题了。

其次,当 N 很大时,频繁地对一个大的容器进行删除操作可能会导致频繁的内存分配和释放(具体取决于容器的实现方式);而频繁的内存分配/释放,会导致明显的CPU占用并可能造成内存碎片。

境界2为了避免境界1导致的弊端,更聪明的程序猿会构造一个定长的布尔型容器(通常用数组)。

比方说,质数的分布范围是1,000,000,那么就构造一个包含1,000,000个布尔值的数组。

然后把所有元素都初始化为 true。

在筛的过程中,一旦发现某个自然数是合数,就以该自然数为下标,把对应的布尔值改为 false。

全部筛完之后,遍历数组,找到那些值为 true 的元素,把他们的下标打印出来即可。

此种境界的好处在于:其一,由于容器是定长的,运算过程中避免了频繁的内存分配/释放;其二,在某些语言中,布尔型占用的空间比整型要小。

比如C++的 bool 仅用1字节注:C++标准(ISO/IEC 14882)没有硬性规定 sizeof(bool)==1,但大多数编译器都实现为一字节。

境界3虽然境界2解决了境界1的弊端,但还是有很大的优化空间。

有些程序猿会想出按位(bit)存储的思路。

这其实是在境界2的基础上,优化了空间性能。

俺觉得:C/C++出身的或者是玩过汇编语言的,比较容易往这方面想。

以C++为例。

一个bool占用1字节内存。

而1个字节有8个比特,每个比特可以表示0或1。

相关文档
最新文档