【转】素数相关算法总结

转载 2012年07月08日 21:54:50

定义:除了1和其本身,没有其他约数的数。
测试:用n分别试除2到sqrt(n)的数,如果中间有一个能整除,即

为合数,否则即为素数

bool is_prime(int n)//判断n是否为素数,是素数返回1
{
    int i;
    bool flag = 1;
    for(i = 2; i <= sqrt(n); i++)
    {
        if(n % i == 0)
        {
            flag = 0;
            break;
        }
    }
    return flag;
}

小范围内筛素数(数据不太大):

#define Max 1000
int Prime[500];
int q;
void get_prime()
{
    q = -1;
    Prime[++q] = 2;
    Prime[1] = 3;
    int i;
    for(i = 5; i <= Max; i++)
    {
        for(j = 0; Prime[j]*Prime[j] <= i &&i%Prime[j] != 0; j++);
        if(Prime[j]*Prime[j] > i)Prime[++q] = i;
    }
}

大范围内筛素数的普通筛法(很慢):

#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
    q = -1;
    int i,j;
    for(i = 2; i*i < Max; i++)
    {
        if(IsPrime[i] == 1)
        {
            for(j = i+i; j < Max; j += i)
            {
                IsPrime[j] = 0;
            }
        }
    }
    for(i = 2; i < Max; i++)
    {
        if(IsPrime[i] == 1)
            Prime[++q] = i;
    }
}

大范围内素数的线性筛法(比普通筛法更快)

#define Max 1000000
int Prime[500000];
bool IsPrime[Max] = {1};
int q;
void get_prime()
{
    q = -1;
    int i,j;
    for(i = 2; i < Max; i++)
    {
        if(IsPrime[i] == 1)
            Prime[++q] = i;
        for(j = 0; j <= q && Prime[j] * i < Max; j++)
        {
            IsPrime[Prime[j] * i] = 0;
            if(i % Prime[j] == 0)break;
        }
    }
}

求某一区间(a,b)内的素数

有时候我们碰到的问题是要求求出a b间的素数,而a又比较大,

这种情况下就可以用这种方法实现(a>2)
注意:要先通过以上几种方法求出2到sqrt(a的最大取值)范围内

的素数存入Prime[].

int prime[500000];
bool isprime[1000000];
int qt;
void get_prime1(int a,int b)
{
    int i,j,k;
    for(i = 0; i <= b - a; i++)
    isprime[i] = 1;
    for(i = 0; Prime[i]*Prime[i] <= b && i <= q;i++){
            k = a/Prime[i];
            if (k*Prime[i] < a) k++;
            if (k <= 1) k++;
            while(k*Prime[i] <= b){
                isprime[k*Prime[i] - a] = 0;
                k++;
            }
    }
    qt = -1;
    for(i = 0; i <= b - a; i++)
    {
        if(isprime[i] == 1)
        prime[++qt] = i + a;
    }
}


相关文章推荐

算法-素数相关

素数定义: 整数p不等于0,正负1,正负p,且除了正负1,正负p外没有其他约数,那么称整数p为质数或者素数.如果不做特别说明,素数或质数指的是正整数中的质数或者素数. 问题1:判断一个数是否...

算法总结:判断一个数是否为素数

1.约定 x%y为x取模y,即x除以y所得的余数,当x象都为整数。 x^y表示x的y次方。乘方运算的优先级高于乘除和取模,加减的优先级最低。 见到x^y/z这样,就先算乘方,再算除法。 A/B...

算法总结:判断一个数是否为素数

1.约定 x%y为x取模y,即x除以y所得的余数,当x象都为整数。 x^y表示x的y次方。乘方运算的优先级高于乘除和取模,加减的优先级最低。 见到x^y/z这样,就先算乘方,再算除法。 A/B...

算法总结:判断一个数是否为素数

1.约定 x%y为x取模y,即x除以y所得的余数,当x象都为整数。 x^y表示x的y次方。乘方运算的优先级高于乘除和取模,加减的优先级最低。 见到x^y/z这样,就先算乘方,再算除法。 A/B...
  • gzxcyy
  • gzxcyy
  • 2013年09月24日 20:10
  • 514

(转)素数测试算法(基于Miller-Rabin的MC算法)

(转)素数测试算法(基于Miller-Rabin的MC算法)http://hi.baidu.com/hymcorn/blog/item/f2cfaa89db0e6993a4c272a0.html 2...
  • wconvey
  • wconvey
  • 2011年08月03日 10:37
  • 623

素数算法_ 循序渐进

  • 2011年12月15日 11:22
  • 72KB
  • 下载

POJ 2262 Goldbach's Conjecture(素数相关)

POJ 2262 Goldbach's Conjecture(素数相关) http://poj.org/problem?id=2262 题意: 给你一个[6,1000000]范围内的偶数...

逐步修改素数高效算法

  • 2013年08月19日 19:47
  • 19KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【转】素数相关算法总结
举报原因:
原因补充:

(最多只允许输入30个字)