• poj3006 筛选法求素数模板(数论)


    POJ:3006

    很显然这是一题有关于素数的题目。

    注意数据的范围,爆搜超时无误。

    这里要用到筛选法求素数。

    筛选法求素数的大概思路是:

         如果a这个数是一个质数,则n*a不是质数。

         用一个数组实现就是:

         memset(prime,true,sizeof(prime));

         if (prime[i]) prime[i*j]=false;

         部分程序如下:(朴素)

         

    const max=1000005;
    bool prime[1000005];        
            memset(prime,true,sizeof(prime));
        for(i = 3 ; i <= ::max ; i ++ )
        {
            for(j = 3 ; j <= ::max/i ; j ++)
            {
                if(prime[i])
                {
                    prime[i * j] = false;    
                }    
            }    
        }

    之后将中间进行小小的优化:

         我们知道偶数中,除了2,其他的都是合数。

         所以就可以将i++ 和 j++改成i+=2,j+=2;

         再将除2以外的偶数判为false;以及注意一下特殊的值: 1和0是false;(要记住,c++的数组是从0~max的,所以0要考虑在内)

    优化后的程序如下:

         

    const int max = 1000005;
    bool prime[1000005]={false};
        
            memset(prime,true,sizeof(prime));
        for(i = 3 ; i <= 1000 ; i += 2 )
        {
            for(j = 3 ; j <= ::max / i ; j += 2)
            {
                if(prime[i])
                {
                    prime[i * j] = false;    
                }    
            }    
        }
        for(i = 4 ; i <= ::max; i += 2 )
        {
            prime[i] = false;    
        }
        prime[1] = prime[0] = false;
        

    这样,这题就可以在我们拟好的素数表中找到第n个要求的素数。用一个简单的循环就可以搞定。

    附上完整模板

    #include<iostream>
    #include<cstring>
    using namespace std;
    const int max = 1000005;
    bool prime[1000005]={false};
    int main()
    {
        int i,a,d,n,j;
        memset(prime,true,sizeof(prime));
        for(i = 3 ; i <= 1000 ; i += 2 )
        {
            for(j = 3 ; j <= ::max / i ; j += 2)
            {
                if(prime[i])
                {
                    prime[i * j] = false;    
                }    
            }    
        }
        for(i = 4 ; i <= ::max; i += 2 )
        {
            prime[i] = false;    
        }
        prime[1] = prime[0] = false;
        
        while(cin >> a >> d >> n,a != 0 && d != 0 && n != 0)
        {
            j = 0;
            for (i = a; j < n; i += d)
            {
                if (prime[i])
                {
                    j++;
                }
            }
            cout << i - d << endl;
        }
        return 0;
    }
  • 相关阅读:
    盒子模型之边框border
    CSS优先级特性之权重叠加
    CSS三大特性:层叠性、继承性、优先级
    行高
    单行文本垂直居中
    !important
    【DP专题】——[USACO13OPEN]照片Photo
    1:n Oberserver模式
    025_递归算法详解
    字符串移动问题
  • 原文地址:https://www.cnblogs.com/polebug/p/3466157.html
Copyright © 2020-2023  润新知