关于素数

来源:互联网 发布:喵咚家 知乎 编辑:程序博客网 时间:2024/05/18 00:00

 

关于素数

                                                                                                  作者:焦祺         09-03-22

 

传统方法判素数

 

n:判断n是否素数

返回值:素数返回1,否则返回0

源程序:

int prime(int n)

{

         if(n<2)return 0;

         if(n==2)return 1;

         if(n%2==0)return 0;

         for(int i=3;i<=sqrt(double(n));i+=2)

                   if(n%i==0)

                            return 0;

                   return 1;

}

 

筛法求素数:

 

const int N = 25600000;
bool a[N];
int p[N];
int n;

void Prime1() {
   memset(a, 0, n * sizeof(a[0]));
   int num = 0, i, j;
   for(i = 2; i < n; ++i) if(!a[i]) {
       p[num++] = i;
       for(j = i+i; j < n; j +=i) {
           a[j] = 1;
       }
   }
}

 

线性求素数:

 

const int N = 1000005;

bool a[N];

int p[N];

// bool hash[1000005]; 记录某数是否为素数

void Prime2(int n) //线性法,参数表示要打多少内的素数

{

   memset(a, 0, n*sizeof(a[0]));

// memset(hash,0,sizeof(hash));

   int num = 0, i, j;

   for(i = 2; i < n; ++i)

   {

       if(!(a[i]))

            {

                      p[num++] = i;

//                 hash[i] = 1;

            }

       for(j = 0; (j<num && i*p[j]<n); ++j)

            {

           a[i*p[j]] = 1;

           if(!(i%p[j])) break;

       }

   }

}

 

经典题目: PKU 2262 Goldbach's Conjecture

http://acm.pku.edu.cn/JudgeOnline/problem?id=2262

题解可以访问以下网址

http://blog.csdn.net/jqandjq/archive/2009/03/22/4013876.aspx

 

这种线性打素表的另一方面的应用:

 

a[]改成int类型,然后

void Prime2() {

    memset(a, 0, n*sizeof(a[0]));

    int num = 0, i, j;

    for(i = 2; i < n; ++i) {

        if(!(a[i])) p[num++] = i;

        for(j = 0; (j<num && i*p[j]<n && (p[j]<=a[i]||a[i]==0)); ++j) {

            a[i*p[j]] = p[j];

        }

    }

}

这样一来a[i]将记录i的最小质因子

那么[0, n)内的数的因式分解就可以... 嘿嘿

o(质因子个数)求任意数因式分解:

void factor(int x) {

    while(a[x] != 0) {

        printf("%d/n", a[x]);

        x /= a[x];

    }

    printf("%d/n", x);

}

 

 

参考网页及文献:

 

http://hi.baidu.com/miaoever/blog/item/b5e3f9b32d24eca2d9335adc.html

http://cylixstar.blogbus.com/logs/10601589.html

 

 

 

原创粉丝点击