质数的判断(C)
定义:
设N为大于1的任意整数,若N的因数只有1和N,则N称为质数。
性质:
1.非2的偶数不是质数 2.所有大于10的质数个位数必然为1,3,7,9
更多性质 详见度娘:https://baike.baidu.com/item/质数/263515?fr=aladdin 当然还有一些别的性质啦,比如什么6的附近咋样咋样的,这里因为我没用,所以就不介绍了。
a: 2这个偶数是质数,如果我们想要不对所有偶数进行判断的话,则必须对2处理,处理之后我们可以使任意偶数不进入判断循环。您一路走好~
b: 利用质数的第2条性质,我们可以使大于10但个位数为5的所有数不进入循环。拜拜了您!个5
c: 在分析a中我们把所有偶数滤过了,能进循环的只能是奇数!而奇数的因数不可能有偶数,那我的为何还要循环去判断某一偶数是不是因数呢是吧?将循环初始条件为i=3,步长为2。哎打扰了呀,偶数判断再见!
d: 判断质数的因数时我们只需要判断到该数的开方就可以了。不多说,因为因数不甘孤独,都是成对出现的。我举个栗子:比如21,其因数对有(1,21)、(3,7)再如54,因数对有(1,54)、(2,27)、(3,18)、(6,9)。从来没有甘于孤独的因数,不信你再试试别的数。你再看看因数对中小的那个有没有超过判断目标的开方?没吧?所以我们判断到开方就行了。
代码看着有点多,但效率还不错。对了,我没处理输入,假定输入一定是大于1的整数,你要是输入不符合这个规则的东西,辣我也没滴办法。你要是想提高逼格,可以加处理输入的代码。
如果我们可以将判断得到的质数存入数组,我们还可以利用已知的质数去判断下一个数是不是质数,进一步提高判断效率,这个思想可以用在输出max以下所有质数这种情况。这里我用python实现以下:
import math x = [2,3,5,7] #10以内的质数 max = 100 #目标区间[1,max] for i in range(11,max+1,2): #大于10开始,只判奇数 if i == 5: #末位为5必不是质数 continue for j in x: if j > math.ceil(i**0.5): #判到开方 x.append(i) break if not i%j: #j是i的因数,跳出 break print(x)