筛法_算法进阶

来源:互联网 发布:c语言告白 编辑:程序博客网 时间:2024/05/18 20:07

描述:

用筛法求[a,b]中的素数。
Find out the prime numbers in [a, b].

输入:

2个正整数:a b。
a、b均在100000000以内,且a小于等于b,且b-a<250000。
2 positive integers: a, b. Both a and b are less than or equal 100000000 and a is less than or equal to b, and b - a < 250000.

输出:

[a b]区间内的所有素数,每个单独一行。
All primes in [a, b], each one in a row.

输入样例:

2 5

输出样例:

235


#include <iostream>
#include <math.h>
using namespace std;
int a, b;
int A[10000];
int p[2000];            //2到floor(sqrt(b))的素数
int T[250000];           //目标素数表
int cnt;                //p[i] 的个数
int temp3;              //floor(sqrt(b))
void tableprime();
void init();
void aimprime();
int ss(int m);
int main()
{
    int n;
    cin >> a;
    cin >> b;
    init();
    tableprime();                    //生成2到floor(sqrt(b))的素数表
    aimprime();                      //生成目标素数表
    //输出
    for(n = a; n <= b; n ++)
    {
        if(n == 1)
            continue;
        else
        {
            if(T[n - a] == 1)
                cout << n << endl;
        }
    }
    return 0;
}

void aimprime()
{
    int i, j, k;
    int temp2;       //从 a + temp2 开始
    for(i = 0; i < cnt; i ++)
    {
        if(a >= p[i])
        {
            if(a % p[i] == 0)
            {
                if(ss(a))
                    temp2 = p[i];
                else
                    temp2 = 0;
            }
            else
                temp2 = p[i] - a % p[i];
            for(j = a + temp2; j <= b; j += p[i])
            {
                if(T[j - a] == 1)
                {
                    T[j - a] = 0;
                }
            }
        }
        else
        {
            for(j = p[i] * 2; j <= b; j += p[i])
            {
                if(T[j - a] == 1)
                {
                    T[j - a] = 0;
                }
            }
        }
    }
}



void tableprime()
{
    int i, j ,k;
    temp3 = floor(sqrt(b));
    for(i = 2; i <= temp3; i ++)
    {
        if(A[i] == 1)
        {
            for(j = i + 1; j <= temp3; j ++)
            {
                if(j % i == 0)
                    A[j] = 0;
            }
        }
    }
    i = 0;
    for(k = 2; k <= temp3; k ++)
    {
        if(A[k] == 1)
        {
            p[i] = k;
            i ++;
        }
    }
    cnt = i;
}
void init()
{
    int i;
    temp3 = floor(sqrt(b));
    for(i = 2; i <= temp3; i ++)
    {
        A[i] = 1;
    }
    for(i = a; i <= b; i ++)
    {
        T[i - a] = 1;
    }
}
int ss(int m)
{
    int i;
 for(i=2;i<=sqrt(m);i++)
    {
        if(!(m%i))
            return 0;
    }
 return 1;
}

算法:1,输入a和b
           2,生成2到floor(sqrt(b))的素数表
           3,再用2到floor(sqrt(b))的素数依次筛选a到b的元素
           4 ,将a到b剩下的元素输出
其中aimprime()函数的实现(temp2关键),即筛选a到b中元素的初始点很关键
希望能对大家有所帮助!!!

原创粉丝点击