几种判断素数的办法。

来源:互联网 发布:工业以太网知乎 编辑:程序博客网 时间:2024/06/04 18:45
(1)最基本素数判定方法大家熟悉,只用看看2到n(或n的平方根)之间有没有n的约数:
#include<stdio.h>
void main()
{
    int i,n;
    scanf("%d",&n);
    for(i=2;i<n;i++)
        if(n%i==0)break;
    if(i<n||n==1)puts("No");
    else puts("Yes");
}
此方法适用于判定较少数,数据量大时会超时。
(2)筛选法求素数也重要的求素数方法之一。这种方法主要用于打素数表,如求出n之内的所有素数,其思路是从1开始遇到一个素数就标记一下,并去掉n之内的大于它的所有倍数,直循环到n:
#include<stdio.h>
int n,i,j,a[1000001],p[100000],t=0;
void main()
{
    scanf("%d",&n);
    a[1]=0;
    for(i=2;i<=n;i++)a[i]=1;
    for(i=2;i<=n;i++)
        if(a[i]){
            p[t++]=i;
            for(j=i+i;j<=n;j+=i)a[j]=0;
        }
    for(i=0;i<t;i++)
        printf("%d%c",p[i],i<t-1?' ':'/n');
}
此方法也有局限性,数据量中等时才不会超时,数据量过大时也会超时,而且只能用素数打表,不能对单个数进行判定!
(3)这是我根据《离散数学》上的一个定理想到的,定理为:“若正整数a>1,且a不能被不超过a的平方根的任一素数整除,则a是素数”,实现过程如下:
/*///////////////////////////////////////////////////////////
定理:
若正整数a>1,且a不能被不超过a的平方根的任一素数整除,则a是素数
*////////////////////////////////////////////////////////////
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int p[1000000], t;
//数组p用于存储主函数循环得到的素数,
bool prime(int n)
{
int i,q;
q = (int)sqrt(n);
for (i = 0; p[i] <= q&&t; i++)
{
if (n%p[i]==0)
{
return false;
}
}
return true;//循环结束,未找到不超过a的平方根的任一素数整除。
}
int main()
{
int n, i;
while (cin >> n)
{
memset(p, 0, sizeof(p));
t = 0;
for (i = 2; i <= n; i++)
{
if (prime(i))//若满足条件,则存在数组上。
{
p[t++] = i;
}
}
cout << "N以内的素数个数为:" << t << endl;
for (i = 0; i < t; i++)//打印不大于n的素数。
{
cout << p[i] << ' ';
}
cout << endl;
}
return 0;
}
此方法可以对超大量数据的进行打表!
此方法也同样合适于素数打表,判定单个时这个方法不可取!
(4)由方法(3)延伸出另一个素数判定方法:
#include<iostream>
#include<cmath>
using namespace std;
int p[8] = { 4, 2, 4, 2, 4, 6, 2, 6 };
bool prime(int n)
{
int i = 7, j, q;
if (n == 1)
{
return false;
}
if (n == 2 || n == 5 || n == 3)
{
return true;
}
if (n % 2 == 0 || n % 3 == 0 || n % 5 == 0)
{
return false;
}
q = (int)sqrt(n);
for ( ; i <= q; )
{
for (j = 0; j<8; j++)
{
if (n%i == 0)
{
return false;
}
i += p[j];
}
if (n%i == 0)
{
return false;
}
}
return true;
}
int main()
{
int n;
while (cin >> n)
{
if (prime(n))
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}
这种方法既可以用于最快速地判定单个数,也可以用于判定超大量的数据。
此方法判定单个数时要比第(1)种方法要快得多,用于大量数据素数打表时稍逊于第(3)种方法,却要比第(2)方法快得多。

这几判定素数方法中我个人认为第(4)种最好用,不过不容易理解,我也解释不清楚(只可意会,不可信传),大家看看哪个方法好用就用哪个吧!

原文地址:http://blog.csdn.net/l04205613/article/details/6025118

0 0