一、概述
素数,又称质数,一个你小学到现在都十分苦恼的老朋友。
我上小学的时候,老师告诉我说把这个数用已经知道的素数从小到大一点一点试,假如说如果都不能除尽,那它就是个素数。前两天偶然辅导一个小学生的数学作业,发现几乎都使用素数表这个东西。(确实这种东西也比较玄学)
那程序如何实现的呢?主要分为三个方法:定义筛法、埃氏筛法、欧氏筛法。各有用途,大家自行理解和使用。
二、定义筛法
定义法是三种方法里比较容易理解的,它也正如它的名字所描述。
原理:根据定义来找素数。
我们来看一下代码:
bool isprime(int n)//是则返回真,不是则为假
{
int i=2;//1因为我们人为定义它不是素数,而且1也会陷入死循环
while (i<=sqrt(n)&&n%i!=0) ++i;//当它不超过n的平方根时,用n一个一个试;
if(i<=sqrt(n))return 0;//没经受住上述历练
else return 1;//通关
}
细心的朋友可能已经发现一个问题,为什么i<=n的算数平方根???
我们来举一个简单的例子:
假如我们要求 12 这个数是不是一个素数,我们先分析 12 这个数有什么构成。
可以由1*12、2*6、或者3*4构成。我们从小往大开始一个个枚举,发现2已经可以;假如我们继续到枚举到12,发现完全没有浪费这个时间的必要。
我们可以得出以下结论,任何可以由两个数相乘得出的数,只用测试到这两个数最大中的最小就可以,然而让他们两个同时最小的就是开平方。
三、埃氏筛法
埃氏筛法是数学家埃拉托斯特尼所发明的一种比较稳定的求素数方法,他还可以顺带记录下来沿途的素数,我个人认为有个地方还是很有意思的,这就是智慧的体现和数学的魅力。
原理:用已经有的素数筛掉未

最低0.47元/天 解锁文章
1220

被折叠的 条评论
为什么被折叠?



