NC50555. Goldbach's Conjecture
描述
输入描述
多组数据,每组数据一个n。
读入以0结束。
输出描述
对于每组数据,输出形如n=a+b,其中a,b是奇素数。若有多组满足条件的a,b,输出b-a最大的一组。
若无解,输出Goldbach's conjecture is wrong.。
示例1
输入:
8 20 42 0
输出:
8 = 3 + 5 20 = 3 + 17 42 = 5 + 37
C++14(g++5.4) 解法, 执行用时: 20ms, 内存消耗: 1400K, 提交时间: 2020-08-24 17:48:59
#include <bits/stdc++.h> using namespace std; #define MAXN 1000000 #define MAXSQRTN 1000 int n; bitset<MAXN+5> is_not_prime; int main(){ //freopen(".in","r",stdin); //freopen(".out","w",stdout); for(int i=2;i<=MAXSQRTN;i++){ if(!is_not_prime[i]){ for(int j=i*2;j<=MAXN;j+=i){ is_not_prime[j]=true; } } } while(scanf("%d",&n)==1&&n!=0){ for(int i=3;i<=n;i++){ if(!is_not_prime[i]&&!is_not_prime[n-i]){ printf("%d = %d + %d\n",n,i,n-i); break; } } } return 0; }
C++(clang++11) 解法, 执行用时: 124ms, 内存消耗: 1596K, 提交时间: 2021-05-14 16:18:37
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int n; bool check(int x){ if(x <= 1) return false; for(int i = 2;i <= x / i;i ++ ){ if(x % i == 0) return false; } return true; } int main(){ while(scanf("%d", &n), n){ for(int i = 2;i <= n / 2;i ++ ){ if(check(i) && check(n - i)){ printf("%d = %d + %d\n", n, i, n - i); break; } } } return 0; }