zoukankan      html  css  js  c++  java
  • 素数筛打表和大素数打表 POJ2689

    素数打表的方法是数论里面非常常用的技巧,如果数比较大的话,筛出其中的素数跟普通筛的原理差不多。

    就是给数组一个偏移量,然后来筛取,比如用0~100000来表示100000000~100100000的素数表,弄一个100000000的偏移量就好了

    每次,写随笔之前基本上都自己敲一遍代码,然后提交看看,果然写出来的还是有那么点问题,还要调试调试。之前AC的代码,是骗自己的代码。

    自欺欺人实例,把prime和prime2分开来考虑,当L大一点时候用prime2,否则用普通素数表。其实是有BUG的。。。就是自己设置的L大一点是大多少,如果太大就会正好卡掉几个普通素数表的没有存储的素数,当时AC了,就没仔细思考,现在回头想明白了。

    正确代码:

    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    using namespace std;
    const int N = 1e6 + 50;
    typedef long long LL;
    int vis[N];
    int prime[N];
    int cnt = 0;
    int cnt2 = 0;
    int prime2[N];
    
    void getPrime()
    {
        cnt = 0;
        memset(vis, 0, sizeof(vis));
        for(int i = 2; i < N; i++)
        {
            if(!vis[i])
            {
                prime[cnt++] = i;
                for(int j = i*2; j < N; j+= i)
                    vis[i] = 1;
            }
        }
    }
    
    void getPrime2(LL L, LL R)
    {
        cnt2 = 0;
        if(L < 2) L = 2;
        memset(vis, 0, sizeof(vis));
        for(LL i = 0; (LL)prime[i]*prime[i] <= R; i++)
        {
            LL k = L / prime[i] + (L % prime[i] > 0); //想上取整
            if(k == 1) k = 2;
            for(LL j = k*prime[i]; j <= R; j += prime[i])
            {
                vis[j - L] = 1;
            }
        }
        for(LL i = L; i <= R; i++)
        {
            if(!vis[i - L])
            {
                prime2[cnt2++] = i;
            }
        }
    }
    
    int main()
    {
        getPrime();
        int l, r;
        while(scanf("%d%d", &l, &r) == 2)
        {
            getPrime2((LL)l, (LL)r);
            int x1, y1, x2, y2;
            if(cnt2 <= 1)
            {
                printf("There are no adjacent primes.
    ");
                continue;
            }
            x1 = x2 = prime2[0];
            y1 = y2 = prime2[1];
            for(int i = 1; i < cnt2; i++)
            {
                if(prime2[i] - prime2[i-1] < y1-x1)
                {
                    x1 = prime2[i-1];
                    y1 = prime2[i];
                }
                if(prime2[i] - prime2[i-1] > y2-x2)
                {
                    x2 = prime2[i-1];
                    y2 = prime2[i];
                }
            }
            printf("%d,%d are closest, %d,%d are most distant.
    ",x1,y1,x2,y2);
        }
        return 0;
    }

     

     

    如果有错误,请指出,谢谢
  • 相关阅读:
    spring全家桶的pom的基本配置
    springboot项目中的普通Session和使用redis存储session
    Springboot项目修改html后不需要重启---springboot项目的热部署
    springboot的异步调用
    最近5年183个Java面试问题列表及答案[最全]
    SpringBoot 之Spring Boot Starter依赖包及作用
    最近玩了下linux下的lampp注意一些使用
    关于dumper和mysqldump的
    python入门-python处理csv文件格式相关
    好久没玩docker了,温下手
  • 原文地址:https://www.cnblogs.com/Alruddy/p/7226376.html
Copyright © 2011-2022 走看看