00:00
好,这个我们已经写了,写这个叫九九乘号表了,然后接下来呢,我们写一个叫100以内的所有的质数,哎,这个100以内所有质数跟前面写的100以内所有的奇数,偶数这个难度还是差一个量级的啊。嗯,而且这个题的话呢,这个笔试的时候也出现过啊,那让你写质数这个题还是稍微有点难度的啊,你要说面试的时候让你出一个说你写一下100以内偶数的输出啊,那简直都在侮辱你是吧,因为实在太简单了哈啊,你可以跟他说有本事你让我写质数,那前提是你得会哈,你说完以后再写是不好意思是吧,没准备好是吧,这就丢人了啊。哎,然后呢,我们看下这个一般以内所有质数这个该怎么输出啊,也通过这道题呢,咱们来说一下这个不同的实现方式,虽然说呢都是正确的,但是呢,不同的写法呢,这个时间执行的效率差很多,哎,通过这个题呢,我们来说明一下,哎,首先呢,我们在这个呃里边我们去新建一个文件啊,把那个给关了啊,Any pass,那就这样吧,嗯,D盘扣的Z05,下边我们去新建一个。
01:09
哎,输入一个质数啊,嗯,质数呢叫prime number啊这样吧,关于它的一个测试。诶,100以内所有质数的一个输出,好,我们看这个题该怎么做。CTRLCCTRLSCTRLV一下啊嗯,首先的话呢,大家得清楚什么是质数啊,这你要不清楚的话,你肯定写不了,比如奇数啊偶数啊,那也一样啊,那先说一下这个质数的概念吧,嗯,质数也叫做负数是吧?哎,什么叫质数啊?对,只能哎被一和它本身整除的自然数,一和它,哎本身整除的这个自然数,哎,就是我们这有一个数啊,随便我们举个例子,比如说七,哎七呢,我们看它所有的这个约数啊,约数发现诶除了一之外就是它本身了。
02:16
啊,就是这个约束里边呢,只有一和它本身啊,那没有别的这个约数了,它就叫做一个质数,比如15,哎,15的话呢,除了一和15之外啊,还有三和五是吧,所以呢,哎,因为有除了一和他本身之外的这些约束,所以它就不是一个质数。啊,这就是质数的概念哈,这个质数呢,在整个这个,呃,这个各个不管是数学当中啊,还是密码学当中啊,其实都有一些这个广泛的使用啊,因为它不能再分了啊,具有这样的一个优良的特性啊,具体展开我们就不多说了,然后现在呢,我们希望输出100以内的所有的质数啊,那我们呢,就得根据这个定义来。啊,就像高中你上学的时候,其实我们这个学过很多的定理呀,包括定义啊性质啊,来做一些题目是吧,其实这个题目的话呢,让你判断一个东西是不是一个什么什么东西,那你最主要的就是先看定义。
03:06
啊,满足定义,那就是不满足就不是啊,现在让你输出质数也是一样啊,那我们最先考虑的就是满足这个定义,那就是不满足就不是。啊,就是这样的一个简单的道理啊,那我们看一下能不能从这个定义出发呢,去把这个题目搞定啊,说只能被一和它本身整除。啊,那这时候呢,如果说我们拿到一个数啊,说这个数呢,看看能不能被一整除,能不能被它本身整除,如果能,我就输出说是只数,这对吗。不对对,那所有的数都可以是吧,关键呢,就是说我们除了一和他本人之外呢,是不是别的那些数发现不行才可以啊对,所以这道题的话呢,我们如果完全说就是这个职能呢,这块呢,其实有点限制你了啊,就是我们关注的就不能是一和它本身啊,而且应该而应该关注的就是从二开始到比这个数小的那个段的数。
04:00
哎,考虑给它除,看看能不能除新的问题了,哎,就比如说这个N吧,我们想发现N是不是一个质数,那你不能拿一和它本身去除了,所有数都可以,那你得从二开始啊,三等等等等等得一直到N减一,哎,这一段数呢,被这个N除一下。看看有没有是N的约束的。就是有没有的啊,如果要是没有。那就是一个指数。那如果要是有,一旦要是有,它就不是一个质数。哎,其实我们是这样判断的哈,行,那相当于咱们把这个定义呢,给它又重新的翻译了一下哈,我们如何判断一个数是否是质数啊,那我们就相当于是,哎,从二开始。哎,这个倒,哎,这个数减一结束。哎,为止,哎说都不能。哎,都不能被,哎这个数本身整除,哎咱们呢,实际上是依赖于这样的一个这个这个描述啊,去衡量它是否是一个指数。
05:10
行,那下边呢,我们就按照这个逻辑啊,再进行一个判断,首先我们这里边呢,需要让你计算的是100以内的啊,所以我们首先呢,写一个for循环,哎,来便利一下100以内的这些所谓的自然数啊,在这个便利的话呢,我们这也得关注一个事实啊,就是这个叫最小的这个质数是是嗯二二啊是二啊,这个小学可能学的没太明白是吧,二啊,所以这块我们写的话呢,自然而然的咱就从二开始起啊。哎,那I呢,小于等于100I加加。诶,首先呢,咱们先去遍历一下二到100的这些自然数,然后从这里边挑,看看哪个I呢是靠谱的。行,那接下来呢,我们再要写的话,就是判断这个I行不行。
06:01
咱们说了得从二开始,到你这个A减一结束。那自然而然的是不是又得是个放,哎,我让那个阶,哎从二开始到阶呢,小于I也行,或者你说小于等于I减一也呃,I减一也可以是吧。可以这样写吧。小A不就是小就是最大,不就是A减一嘛,对,然后接着不断的加加。好,这个逻辑到目前为止是不是都还可以看得懂啊,对,这个呢,是咱们主要的便利便利。这个100以内的自然数,哎,这个呢,主要是用来让我们去当这个除的这个数来算的啊,然后呢,这个街呢,哎,我们说让被I去除。哎,看看呢,是否能出境的问题啊,那下面呢,我们就来判断了,这一类肯定是涉及到一些易操作了啊,比如说呢,我们让那安呢去取模接的时候呢,那接下来看怎么写,我是说是等等于零还是不等于零要呢?
07:14
啊,你要是取模之等等于零了,说明这个数肯定不是一个质数了,对吧,你说我在这一定要出现等等于零,我这块就输出,那你输出的肯定不是一个质数,应该说正好是非质数的那些数了啊,那咱要的不是这些数啊,所以你不能要这个,那些同学可能就想,那哦,那要不是要这个数,那我就改成不等于零。不等于零,这就对了吗?如果说取模积不等于零,我说这个I呢,就是个质数对吗?那也不对呀,对呀,你比如说我们这个数是,嗯,我们举例九吧,九我们这边一开始让这个积是二开始给它除,那九除二也没出进啊,我除一个没出进,你就不能说我就是质数二,你得出完是吧。
08:07
出完之后呢,都没有,那它才是一个,那这个题呢,就拿到这了。哎,他就拿到这了啊,就是你这块呢,你写等于等等于也不对,写不等于也不对,那怎么整啊,哎对,那这里边就涉及到问题,就是不是说呢,你这个I取模接这一次就能搞得定的,你得把这个所有的街都考虑完以后,我们看一下这个I是否都没有出进过,这个时候呢,才能说I是质数或不是质数,对吧。这个题这个可能说完以后还是有点难啊,就像咱们前面的,你证明这个I是否是一个奇数后,偶数它一次就可以搞定,我出了出现了就是没出进,它就不是这个呃偶数,所以它一次性就可以搞定,而我们此时这个I呢,它一次输了不算。
09:00
啊,你说这个阿,这些除尽了或除不尽,你就说它是质数还是非质数不对是吧,他得把这一些都走完一遍以后,他才能够证明,所以呢,一次搞不定的,你就不能这样去写了。哎,刚才有同学提到说我们定义一个变量,哎,这呢就是一个比较好的一个方式啊,哎,举个例子啊,比如说呢,我在这个位置,哎,我们去定一个布尔型的变量。因为呢,我们就两种情况,没有必要定义其他类型啊,哎,我们不妨呢,就叫做is flag啊,哎先呢,给它赋一个值,比如说是true。哎,Flag呢,就是一个标志的意思啊,就是翻译过来有个小旗。啊,其实就有个标识,就是一个标识啊,这个标识干什么用的,大家看我这呢定一个单量,它是一个触,然后呢,我在这里边呢,哎,去让I呢来取模这个接我这呢用的不是不等了,我用的是等等言来句呢就是被除尽了啊,一旦要是I被这个接取模时除尽了,我就把这个is flag呢改成是一个false。
10:08
相当于这个小钱呢,我就给你变了一个值。嗯,那大家想啊,我们这个内层的for循环,就是从二开始一直到7I减一啊一直呢,被这个H取模走走走走走走完一遍以后,我这个放循环,比如说结束了。我到这儿的时候。我们就可以来做一个决定了,说此时我已经把内存的从二开始到I减一都走完一遍了,啊这个时候呢,我们来看一下这个I到底它是不是一个质数怎么的,哎,只需要判断我们这个flag呢,它是不是还是当初的那个处是不是就可以了,哎,你要是处说明他就没有进去过。没进去过,就意味着没有除尽过。这不就意味着这是出境的意思,哎呢,对,这个接境了,你要出境呢,意味着这个不就是你的约了,你要是约数我就给你改了,你像我们这个如果要是还是数,那就意味着我们从二开始到A减一,从来没有进去过,既然从来没有进去过,说明你就是一个质数,哎,我们在证明一点,就是说你还是一个处,此时呢,咱们就把这个I呢输出,这个逻辑呢,能捋顺不?
11:32
这个I就是我们想要的那个质数,那这个I放完以后呢,这个I是在我们这个行完这块啊,这个执行完以后,我们接着这不是整体这一块,作为我们外层循环的一个循环体了啊,这个执行完以后,这不是I在接减,I在加加嘛,开始判断下一个,哎哎就接着再去走,然后走完以后呢,再过来,哎就这样,哎感觉上呢,应该差不太多了。
12:00
哎,所以到目前这个词法里边一个难点呢,就是我们这个flag啊,用它呢来做一个标识,哎标识什么呢?标识这个I是否被这个阶呢?哎除尽过啊一旦除尽哎就修改其值,哎就是这样的一个特点啊好写完以后我们下边呢CTRLS执行一下。张亚飞,对,我们现在写完以后呢,可能还会有一些问题啊,咱们跑着看编译,编译的时候错了啊,这确实有一些问题啊,这有点low的问题了,重来编译Java prime number test,好,很兴奋啊,这时候我们一直行,诶,就出来了一个二和三哈,显然质数不止二根三。二三是对的啊,那为什么错了?出在哪错?大家看一看,看谁能够看出来。
13:03
哪块出问题了,那大点声音啊可以看谁可以举手说一下就行啊,嗯嗯,行,那后边那个哪出问题了。他说这个这块呢,我们要重置一下啊,为什么要置一下呢,23。二三都出来了,对四的时候这是四,这是二除进了这个flag呢,我们是false这块呢没进去,所以四没输出,这个很正常。哎,对,大家能听懂吧,诶关键呢,就是我们这个二三呢都是质数,在四的时候呢,它破坏了这个情况了,我们这个四的话呢,确实除尽了,所以我们把这个flag呢改成false了,改成false以后确实呢四没输出啊,OK,但是到五的时候呢,呃,到五的时候,按说这个时候你的是不是应该重置市的出啊,这个时候没有重置,所以错了啊,那怎么重置呢?在哪重置啊,哎,我在这是不是重置一下就可以了,哎重置我们这个flag,哎is啊flag这个值就行。
14:32
嗯,这个大家呢,其实可以这样理解哈,这个给大家举一个实际的情境,这个题呢就好理解了,就是比如说呢,咱们大家在座的每一个同学呢,都相当于是一个自然数了啊,从二开始的一个自然数啊,然后大家呢,所有的都在咱们这个,咱们后门的外面都排队啊,就是从二到100,假设呢,每个人就代表的这个自然数,然后呢,每个人呢,进屋子啊,就是谁进屋子谁就代表着当前这个,哎,进来以后呢,我们干什么事呢?屋子里边有一个比如一个。
15:00
几个老师,假如我就其中一个老师啊,作为一个审判的一个人,然后呢,看看你代表的这个数是几,我呢,就从二到小于你代表的这个数这个范围之内呢,被你去除,呃,不是应该说除你是吧?看是否能除进,那这个flag相当于什么呢?相当于就是你身上穿了一个马甲,呃,你穿个马甲就是进来之前呢,你这个马甲比如说是一个畜,假设我们认为是一个干净的一个马甲,然后呢,我就开始做这个橱,一旦发现呢,除尽了,我就往你这个马甲上,你打这个大叉。打叉呢,意味着就是你不是直属,哎那接着呢,哎,这个我这个一不断的这样去执行执行,哎打过叉,打过叉以后呢,后来出了这个循环,比如说在我们这个前门的门外边呢,还有个人在这看着呢,他看看你身上这个马甲呢,有没有叉。哎,这个处呢,不如我们就说是干净的嘛,如果发现你这个衣服上没有这个叉,他就认为你就是一个支出,所以就把你给输出了,如果你身上要有叉了,就不输出啊,那我们刚才的情况是什么呢?这个马甲呢,我们应该这个当前的I判断完以后呢,他给下一个I的时候呢,你把这个马甲呢洗干净。
16:11
啊,那洗干净给下个人用,你要不洗干净四已经是一个打叉了,那你想想后边这个人穿的时候呢,都没有意义了,就始终都是打叉的,所以后边的就全部都出不来。是不是这意思啊,哎,你拿这个举几个例子就可以来加上这样一个逻辑以后我们再来执行编译运行,哎,大家看此时呢,我们就能输出100以内的这些指数。哎,这就是正确的一个情况啊,刚才其实有一个同学有个微弱的声音被我听到了啊,他说这个flag呢,其实不用写到这儿,哎把这个呢,比如说我给它注释掉,然后我把这个flag呢,CTRLX我放到这个位置。是不是也可以这个洗完以后呢,这个其实就可以删掉了。啊,你看我们这个时候呢,这整体是一个循环体了,呃,进来以后呢,我们定义了一个flag,然后执行完以后,该挨的下一个值的时候呢,一上来又重新定了一个变量,哎,CTRLS,我们先来执行,看看变异变形,那是不是也是对的,那这个相当于什么情况对不对?每个人穿了一个自己的新马甲,哎,前一个人打了叉以后呢,没关系,我也不用给他重置了,下个人进来的时候呢,自己身上又重新穿了一个马甲。
17:32
啊,因为我们每一个I的时候,在里边都重新定义了一个变量,不就这意思吗?哎,所以说用哪种方式呢,其实都可以啊,你要按说的话呢,这这种写法虽然说是代码量小了,但是好像不如这个,是不是内存空间加载的变量少啊,哎,行,那你要是写到外边的话呢,这个你就给它打开,哎,也就这么个点啊都可以行,呃,这呢,就是咱们写的这样一个100以内支出的一个输出,呃,基本上是把这个问题先解决了,然后呢,咱们来看一下怎么写可以让这个效率更高啊,我们对它呢进行一个优化。
我来说两句