C++题解:哥德巴赫猜想

 目录

题目 

题解


题目 

  •  1000ms
  •  131072K

1742 年 6 月 7 日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于 5 的奇数都可以表示成 3 个质数之和。

这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。

现在请你编一个程序验证哥德巴赫猜想。

输入格式

第一个奇数 n (5<n<105)。

输出格式

输出三个用空格分隔的质数,如果有多个答案,输出字典序最小的。

输出时每行末尾的多余空格,不影响答案正确性

要求使用「文件输入输出」的方式解题,输入文件为 goldbach.in,输出文件为 goldbach.out

样例输入

119

样例输出

3 3 113

题解:

知识点:数学

分析:题目比较简单,先用埃氏筛法预处理出质数,再一个一个去枚举

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+5;
bool vis[N];//vis[i]表示i是否是质数,true是“不是”
int main(){
    int n;
    scanf("%d",&n);
    vis[0]=vis[1]=true;//注意0、1
    for (int i=2;i<=n;i++){//埃氏筛质数法,手动模拟一遍即可理解
        if (!vis[i]){
            for (int j=i;j<=n;j+=i){
                vis[j]=true;
            }
            vis[i]=false;
        }
    }
    for (int i=2;i<=n;i++){
        if (vis[i]){//如果是质数,跳过
            continue;
        }
        for (int j=2;j<=n;j++){
            if (vis[j] || n-i-j<=1 || vis[n-i-j]){//看看是否符合哥德巴赫猜想,n-i-j是第3个数
                continue;
            }
            int a[3];//排一下序,本人比较懒,不想手写
            a[0]=i;
            a[1]=j;
            a[2]=n-i-j;
            sort(a,a+3);
            printf("%d %d %d\n",a[0],a[1],a[2]);
            return 0;
        }
    }
    return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值