洛谷P1579.验证哥德巴赫猜想(DFS+素性测试)
题目背景
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。
这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。
从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
题目描述
现在请你编一个程序验证哥德巴赫猜想。
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。
输入格式
仅有一行,包含一个正奇数n,其中9<n<20000
输出格式
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。
输入输出样例
输入 #1
2009
输出 #1
3 3 2003
我的分析
此题就是暴力递归搜索,本身没什么难度,但是如果用常规的枚举2到sqrt(n)之间的数来对n进行素性检测的方法,最后一个样例就过不了!重要的事情说三遍,过不了!过不了!过不了!(超凶╭(╯^╰)╮)
于是,我又去网上找了一个改进后的素性测试方法(虽然搞不懂什么原理O(∩_∩)O),然后成功地通过了所有样例
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
//素性检测函数
bool isprime(int n){
int p[8]={4,2,4,2,4,6,2,6};
int i=7,j,q;
if(n==1)return 0;
if(n==2||n==5||n==3)return 1;
if(n%2==0||n%3==0||n%5==0)return 0;
q=(int)sqrt(n);
for(;i<=q;){
for(j=0;j<8;j++){
if(n%i==0)return 0;
i+=p[j];
}
if(n%i==0)return 0;
}
return 1;
}
//tmp数组用来暂时缓存可能成为答案的3个数,res数组用来储存最终答案的3个数
int res[4],tmp[4];
void dfs(int n,int count){
//如果已经积累到2个素数了,那么本轮递归传入的n就是剩下的一个数了
//若n为素数,则产生一组可能答案,以下步骤尝试更新最终结果
if(count==2&&isprime(n)){
tmp[++count]=n;
if(tmp[1]<res[1]){
res[1]=tmp[1];
res[2]=tmp[2];
res[3]=tmp[3];
}
else if(tmp[1]==res[1]){
if(tmp[2]<res[2]){
res[1]=tmp[1];
res[2]=tmp[2];
res[3]=tmp[3];
}
}
return;
}
//若已经积累2个素数,而剩下的一个数非素数,则返回
else if(count==2) return;
for(int i=2;i<n;++i){
if(isprime(i)){
tmp[++count]=i;
dfs(n-i,count);
count--; //注意递归返回后计数器也一定要跟着复原
}
}
}
int main(){
//初始化两个数组,注意初始时res比所给的数大,而tmp一定要比res大
memset(res,20001,sizeof(int)*4);
memset(tmp,20002,sizeof(int)*4);
int n;
cin>>n;
dfs(n,0);
cout<<res[1]<<" "<<res[2]<<" "<<res[3];
return 0;
}
洛谷P1579.验证哥德巴赫猜想(DFS+素性测试)的更多相关文章
- PTA实验4-2-3 验证“哥德巴赫猜想” (20分)
实验4-2-3 验证"哥德巴赫猜想" (20分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两个素数之和.比如:24=5+19, ...
- 洛谷——P1579 哥德巴赫猜想(升级版)
P1579 哥德巴赫猜想(升级版) 题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约 ...
- 洛谷 P1579 哥德巴赫猜想(升级版)【筛素数/技巧性枚举/易错】
[链接]:https://www.luogu.org/problemnew/show/P1579 题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇 ...
- 洛谷P1579 哥德巴赫猜想(升级版)【水题+素数】
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为 ...
- Java实现 洛谷 P1579 哥德巴赫猜想(升级版)
题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是 ...
- 洛谷P1219 八皇后【dfs】
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 洛谷1378 油滴扩展 dfs进行回溯搜索
题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...
- c语言验证哥德巴赫猜想(从4开始 一个偶数由两个质数之和)
#include <stdio.h> #include <stdlib.h> #include <math.h> int isit(int num) { int i ...
- 洛谷 P1579 哥德巴赫猜想(升级版)
嗯... 这或许也算一道数论题吧... 题目链接:https://www.luogu.org/problemnew/show/P1579 这道题的说明好像只会扰乱人的思路....然后就是这道题的细节比 ...
随机推荐
- P1469 找筷子
摘要:有n根(n为奇数)长短不一的筷子,里面可以凑成(n-1)/2双筷子,只剩下一根不能凑对,问那根不能凑对的筷子有多长. 乍听起来好像不难,桶是一个好东西,可是一看数据:对于100%的数据,N< ...
- /dev/mapper/VolGroup00-LogVol00 满了,根目录存储垃圾文件导致磁盘满了
登录系统,df -H 发现磁盘存储快满了 解决办法 1. 使用命令查出根目录下大的垃圾文件 使用 du -sh /* | sort -nr 查看根目录下的的大文件,找的不要的 rm -rf 使用 fi ...
- Docker 基础知识 - 使用绑定挂载(bind mounts)管理应用程序数据
绑定挂载(bind mounts)在 Docker 的早期就已经出现了.与卷相比,绑定挂载的功能有限.当您使用绑定挂载时,主机上的文件或目录将挂载到容器中.文件或目录由其在主机上的完整或相对路径引用. ...
- Redis集群搭建(哨兵)
最近工作中需要用到redis哨兵集群,笔者自己搭建了3遍,直接开始 环境: 1,系统环境 系统 版本 操作系统 CentOS 7.4 Redis 5.0.8 2,IP请修改成自己的IP redis I ...
- 好用的npm模块记录
标签: node node盛行的今天,前端开发已经离不开npm模块的使用,大名鼎鼎的如gulp,webpack等,此处不多说,除了它们有那么几个常用的npm模块是我喜欢并依赖它的,下面就是我平时工作中 ...
- 虚拟化-SDDC软件定义数据中心
一.什么是SDDC? SDDC依赖于虚拟化和云计算技术, SDDC的目标是虚拟化数据中心的一切物理资源,通过虚拟化的技术,构建一个由虚拟资源组成的资源池,不仅是对服务器进行虚拟化,还包括存储虚拟化和网 ...
- Kafka 入门(二)--数据日志、副本机制和消费策略
一.Kafka 数据日志 1.主题 Topic Topic 是逻辑概念. 主题类似于分类,也可以理解为一个消息的集合.每一条发送到 Kafka 的消息都会带上一个主题信息,表明属于哪个主题. Kafk ...
- Nginx配置中文参数说明
#定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; # #全局错误日志定义类型,[ debu ...
- 如何消灭飞机的“黑色十分钟”,AI来帮忙
近年来,“AI的应用和落地”逐渐成了具化的关键词,它和很多事物很多行业结合在一起,形成了奇妙的“化学反应”.例如,在日常生活中,AI可以推送我们喜欢的新闻或视频,可以在拍照的时候识别场景提升照片的美感 ...
- python beautifulsoup基本用法-文档搜索
以如下html段落为例进行介绍 <html> <head> <title>The Dormouse's story</title> </head& ...