P1579 哥德巴赫猜想(升级版)

P1579 哥德巴赫猜想(升级版)

题解

 

其实这个题挺简单的,证明哥德巴赫猜想而已

 

 注意几个小问题:

(1)线性筛,数组开稍微大一点,不然会RE,然后就是线性筛本身了,无论这个新枚举的 i 是不是素数,谁都要把他的质数倍数置为合数

(2)我是先枚举前两个质数,然后减法得出第三个质数,但是这样可能会出现第三个数为 0 或者负数,因此要判断一下

 

 

代码

#include<bits/stdc++.h>

using namespace std;

int n;
bool not_prime[1000001];
int prime[1000001],num_pri;

void xxs()
{
    memset(not_prime,0,sizeof(not_prime));
    not_prime[0]=1;
    not_prime[1]=1;
    for(int i=2;i<=n;i++)
    {
        
        if(!not_prime[i]) prime[++num_pri]=i;    
        for(int j=1;j<=num_pri;j++)
        {
            if(prime[j]*i>n) break;
            not_prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
}

int main()
{
    scanf("%d",&n);
    
    xxs();

    for(int i=1;i<=num_pri;i++)
      for(int j=1;j<=num_pri;j++)
        if(!not_prime[n-prime[i]-prime[j]]&&(n-prime[i]-prime[j])>0)
        {
            printf("%d %d %d\n",prime[i],prime[j],(n-prime[i]-prime[j]));
            return 0;
        }
   
}

 

posted @ 2019-06-13 15:17  晔子  阅读(366)  评论(0编辑  收藏  举报