素数打印的4/n种境界

本文介绍了在C++中打印100~200范围内素数的四种优化方法,从基础的遍历判断到利用奇数性质和开平方特性减少计算量,逐步提升代码效率。
摘要由CSDN通过智能技术生成

①  素数打印的第1/n种境界

练习:打印100~200 之间所有的素数

分析:要打印100~200之间所有的素数,得先产生100~200之间所有的数,再对每个数进行判断,判断其是否为素数,是素数就打印不是素数就不打印,判断下一个数.

根据分析,首先需要利用for循环来产生100~200之间所有的数. 再在循环体中对每一个数进行判断.根据数学原理,判断一个数是不是素数,就要看它除了 1  和  它本身  这两个因子之外,还有没有其他因子,也就是对于每个数,都需要产生 2~(它本身-1) 的数进行试除.

下面来看源代码~

你看懂了嘛~

需要注意的是,有的小伙伴可能执着于cpp的语法,总喜欢在循环参数中定义变量并赋值(像我一样哈哈哈)  在这个地方的j  循环当中,如果直接在循环参数中定义并赋值的话,按照正常的思路,我们会在写下面 if 语句时直接写一个(j==i) 这时候编译器会报错,原因是你是在第二个for 中定义了一个j 变量,而if 语句按照思路是在里层的for 循环执行完之后再执行的,所以在if后面的判断条件中,编译器不知道j 这个变量是啥,所以你得在大的循环当中把j定义下来,而不是在里层的for循环参数里定义 j

运行结果:

②  素数打印的第2/n种境界

第二种境界与第一种境界差不多,只是有一些细微的差别~ 咱们废话少说,直接来看源代码~

你看~ 这样是不是就避开第一种境界中需要注意的点啦,我相信这种解法是cpp 小伙伴青睐的哦~

③  素数打印的第3/n种境界

接下来,我们开始进入这一篇的重头戏~

各位小伙伴是否觉得 每一个i都要试除 2~i-1 这么多数是不是挺麻烦的.

那么为了提高这个代码的效率 , 我们应该怎么做呢?

从i入手来提高的话,你想,在100~200之间的偶数是不是肯定不是素数呀! 因为偶数一定有一个因子2对不?

所以我们只用判断100~200 之间的奇数就好啦,这样是不是在源头上就减少了一半的数据呀~

下面来看源代码~

④  素数打印的第4/n种境界

这一重天,是从 j 下手的.

你是不是觉得,试除这么多数很累,当然,我们累,计算机也累啊! 所以我们要想方设法把 j 变少一点.

怎样变少呢?

你想,对于一个数来说,它的两个因子的大小无非两种情况,一个因子小于它的开平方,一个因子大于它的开平方,另外一种情况是,两个因子都等于它的开平方,也就是一大一小,或者相等,不可能两个都小于它的开平方.

如果你还是不能理解,那就让小编给你举一个例子吧~

eg:16=4×4,则称4为16的开平方,这时两个因子相等都为4. 也就是符合上述的第二种情况,16=2×8 其中2<4 而8>4  这时符合上述的第一种情况.

反之,如果两个因子都小于4.那么它们的乘积一定小于16,如果两个因子都大于4,那么它们的乘积一定大于16.所以对于一个i 来说,只需要在它的开平方左侧试除就行,而不用用所有的数试除.

原因就是对于16来说,2×8 与8×2 是相互的,换言之,如果在4之前没有找到2这个因子,那么在4之后就一定找不到8这个因子.

不知道各位小伙伴能否理解~

下面来看源代码~

⑤  总结

好啦~ 以上就是素数打印的4/n种境界,希望能被小伙伴们看的起,希望能对不太理解的小伙伴有所帮助!

另外,关于这一篇及"整数的拆分打印"  中所包含的所有的代码,我都放在:test 4_14/test.c · 等同于/C.src - 码云 - 开源中国 (gitee.com)

想要深入理解的小伙伴可以看看哦~

好啦~ 这一篇就到这里,我们下一篇再见!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值