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; } }