美文网首页
线性筛素数luogu UVA543 Goldbach's

线性筛素数luogu UVA543 Goldbach's

作者: 不给赞就别想跑哼 | 来源:发表于2018-10-08 20:32 被阅读10次

    【题目描述】
    哥德巴赫猜想:任何大于 4 的偶数都可以拆成两 个奇素数之和。

    比如: 8=3+5

    20=3+17=7+13

    42=5+37=11+31=13+29=19+23

    你的任务是:验证小于10^6的数满足哥德巴赫猜想。

    多组数据,每组数据一个 n。

    读入以 0 结束。

    对于每组数据,输出形如 n=a+b,其中 a,b 是奇素数。

    若有多组满足条件的 a,b,输出 b−a 最大的一组。若无解,输出 Goldbach's conjecture is wrong.(注意有句号)。

    题意很简单也很明显,直接把10^6以内的质素筛出来,然后直接枚举到n/2即可,第一次发现的并且符合的就是解

    循环玩未找到解便否定了哥德巴赫猜想,感觉有点玄学。。。。。。

    话不多说直接上代码

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #define _MAX 1000000
    #include<algorithm>
    using namespace std;
    int x,vis[_MAX],prime[_MAX],cnt;
    int main(){
        memset(vis,1,sizeof(vis));
        for(int i=2;i<=_MAX;i++){
            if(!vis[i]) continue;
            prime[++cnt]=i;
            for(int j=2;j<=_MAX/i;j++) vis[i*j]=0;
        }
        while(scanf("%d",&x)&&x!=0){
            int flag=0;
            for(int i=1;i<=cnt;i++){
                if(vis[x-prime[i]]){
                    printf("%d = %d + %d\n",x,prime[i],x-prime[i]);
                    flag=1;
                    break;
                }
            }
            if(!flag) printf("Goldbach's conjecture is wrong.\n");
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:线性筛素数luogu UVA543 Goldbach's

          本文链接:https://www.haomeiwen.com/subject/anzjaftx.html