AcWing算法提高课-5.1.1哥德巴赫猜想

news/2024/12/22 13:08:04/

宣传一下 算法提高课整理

CSDN个人主页:更好的阅读体验

Start

原题链接

题目描述

哥德巴赫猜想的内容如下:

任意一个大于 4 4 4 的偶数都可以拆成两个奇素数之和。

例如:

8 = 3 + 5 8 = 3 + 5 8=3+5
20 = 3 + 17 = 7 + 13 20 = 3 + 17 = 7 + 13 20=3+17=7+13
42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 42=5+37=11+31=13+29=19+23

现在,你的任务是验证所有小于一百万的偶数能否满足哥德巴赫猜想。

输入格式

输入包含多组数据。

每组数据占一行,包含一个偶数 n n n

读入以 0 0 0 结束。

输出格式

对于每组数据,输出形如 n = a + b,其中 a , b a,b a,b 是奇素数。

若有多组满足条件的 a , b a,b a,b,输出 b − a b-a ba 最大的一组。

若无解,输出 Goldbach's conjecture is wrong.

数据范围

输入最多包含 50006 50006 50006 组数据。
6 ≤ n < 1 0 6 6 \le n < 10^6 6n<106

输入样例:

8
20
42
0

输出样例:

8 = 3 + 5
20 = 3 + 17
42 = 5 + 37

思路

显然这是一道关于质数的题。

观察数据范围,我们发现,需要复杂度最高是 O ( n ) O(n) O(n) 的算法才能过。

所以我们考虑使用线性筛预处理出 1 ∼ 1 0 6 1 \sim 10^6 1106 的所有质数,然后从第一个开始枚举。
如果 p ∈ P p \in \mathbb{P} pP n − p ∈ P n-p \in \mathbb{P} npP,则输出。( P \mathbb{P} P 为质数集)

最后我们考虑无解的情况。

虽然哥德巴赫猜想没有被证明,但是通过我们暴力算法的验证,我们发现在 1 0 6 10^6 106 的范围内的哥德巴赫猜想 一定有解

所以即使你不考虑无解情况照样 AC \color{green}\text{AC} AC

但是作者因为考虑到题解的严谨性,还是写了无解情况的判断。具体细节请看代码。

算法时间复杂度

AC Code

C + + \text{C}++ C++

#include <iostream>using namespace std;const int N = 1e6 + 10;int n;
int primes[N], cnt;
bool st[N];void get_primes() // 线性筛质数
{st[1] = true; // 这里特殊处理1不是质数(我们用false表示质数)for (int i = 2; i < N; i ++ ){if (!st[i]) primes[cnt ++ ] = i;for (int j = 0; primes[j] <= N / i; j ++ ){st[primes[j] * i] = true;if (i % primes[j] == 0) break;}}
}int main()
{get_primes(); // 处理 1 ~ 1e6 所有质数while (cin >> n && n){bool flag = 0;for (int i = 1; primes[i] <= n; i ++ )if (!st[n - primes[i]]) // 如果n-primes[i]是质数就输出{printf("%d = %d + %d\n", n, primes[i], n - primes[i]);flag = 1;break;}if (!flag) puts("Goldbach's conjecture is wrong."); // 无解情况}return 0;
}

228aa7bed3e021faf24cf8560d3e47bb.gif

最后,如果觉得对您有帮助的话,点个赞再走吧!


http://www.ppmy.cn/news/1028123.html

相关文章

sql注入 数字,字符串分析

sql注入 数字&#xff0c;字符串分析 发生场景&#xff1a; i d id id_GET[‘id’]; s q l “ S E L E C T ∗ f r o m a d m i n w h e r e i d ′ sql“SELECT * from admin where id sql“SELECT∗fromadminwhereid′id’ limit 0,1”; 通过观察sql语句可以发现&#x…

【STM32】简介

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星T…

分享一套好用的功能测试用例编写框架

功能测试用例编写框架 功能测试框架可以包括&#xff1a;界面友好性测试、功能测试、链接测试、容错测试、稳定性测试、常规性能测试、配置测试、算法测试等等。 1.1.1 界面友好性测试 1. 风格、样式、颜色是否协调 2. 界面布局是否整齐、协调&#xff08;保证全部显示出来的…

测试老鸟经验总结,Jmeter性能测试-重要指标与性能结果分析(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Aggregate Report …

常用加密算法及实现原理

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 文章目录 对称加密AES 非对称加密RSADSA 哈希函数SHA-256MD5 对称加密 对称加密是一种加密算法&#xff0c;也称为私钥加密。在对称加密中&#xff0c;使用同一个密钥&#xff08;也称为私钥或密钥&#xff09;对…

常见的PLC通讯协议有哪些?

PLC&#xff08;可编程逻辑控制器&#xff09;通讯方式有多种&#xff0c;以下是一些常见的通讯方式&#xff1a; 串口通信&#xff1a;使用串行接口&#xff08;如RS232、RS485等&#xff09;进行通信&#xff0c;常用于与外部设备进行简单的数据传输。以太网通信&#xff1a…

【ArcGIS Pro二次开发】(60):按图层导出布局

在使用布局导图时&#xff0c;会遇到如下问题&#xff1a; 为了切换图层和导图方便&#xff0c;一般情况下&#xff0c;会把相关图层做成图层组。 在导图的时候&#xff0c;如果想要按照图层组进行分开导图&#xff0c;如上图&#xff0c;想导出【现状图、规划图、管控边界】3…

关于Validation的方法使用

acceptance验证 acceptance 是 Rails 中的一个验证器&#xff08;validator&#xff09;&#xff0c;用于验证一个布尔类型的属性是否被接受。在表单中&#xff0c;通常会有一些复选框或单选按钮&#xff0c;用户需要勾选或选择才能提交表单。acceptance 验证器用于确保这些复…