您的位置:首页 > 其它

素数判定算法小结

2014-07-30 17:22 375 查看

素数算法小结

发现很多程序设计题目都需要用到素数判定算法,我也遇到过很多,有的对时间复杂度没有严格的要求,这时候我们时候简单的判定算法即可,而有时对于时间的要求非常严格,这时候就需要一些改进和优化了。

素数的定义:除了1和它本身,不能被其他所有数整除;

下面我来总结一下我自己知道的算法:

最简单的判断:

根据定义,我们只需要从2开始到n结束,做一遍循环判断即可;

bool flag = true;
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
flag = false;
break;
}
}


简单判定的优化:

将被除数判断范围缩小到2~
sqrt(n)


bool flag = true;
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
flag = false;
break;
}
}


利用素数优化:

将判断范围缩小到所有小于n的素数,若一个数不能被所有素数整除,则它本身也是素数

vector<int> v;
v.push_back(2);
for (int i = 3; i < N; i++)
{
bool flag = true;
for (vector<int>::const_iterator it = v.begin(); *it <= sqrt(i); it++)
{
if (i % *it == 0)
{
flag = false;
break;
}
}
if (flag)
{
v.push_back(i);
}
}


筛选算法:

从2开始,将是其2~m倍的数标记,循环到n时,未标记的数都是素数

bool *array = new int
;
for (int i = 2; i < n; i++)
{
for (int j = 2; i * j < n; j++)
{
array[i * j] = false;
}
}


素数表:

将2~n的所有素数记录在表中,需要时查表
table[i]
即可得到

费马小定理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 素数 质数