列表

详情


NC50555. Goldbach's Conjecture

描述

哥德巴赫猜想:任何大于4的偶数都可以拆成两个奇素数之和。比如:

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

输入描述

多组数据,每组数据一个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;
}

上一题