题目背景

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+素性测试)的更多相关文章

  1. PTA实验4-2-3 验证“哥德巴赫猜想” (20分)

    实验4-2-3 验证"哥德巴赫猜想" (20分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两个素数之和.比如:24=5+19, ...

  2. 洛谷——P1579 哥德巴赫猜想(升级版)

    P1579 哥德巴赫猜想(升级版) 题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约 ...

  3. 洛谷 P1579 哥德巴赫猜想(升级版)【筛素数/技巧性枚举/易错】

    [链接]:https://www.luogu.org/problemnew/show/P1579 题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇 ...

  4. 洛谷P1579 哥德巴赫猜想(升级版)【水题+素数】

    1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为 ...

  5. Java实现 洛谷 P1579 哥德巴赫猜想(升级版)

    题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是 ...

  6. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  7. 洛谷1378 油滴扩展 dfs进行回溯搜索

    题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...

  8. c语言验证哥德巴赫猜想(从4开始 一个偶数由两个质数之和)

    #include <stdio.h> #include <stdlib.h> #include <math.h> int isit(int num) { int i ...

  9. 洛谷 P1579 哥德巴赫猜想(升级版)

    嗯... 这或许也算一道数论题吧... 题目链接:https://www.luogu.org/problemnew/show/P1579 这道题的说明好像只会扰乱人的思路....然后就是这道题的细节比 ...

随机推荐

  1. db2创建nickname

    db2创建nickname创建步骤 1.创建 server create server servername type DB2/AIX version 10.5 wrapper drda authid ...

  2. Vue开发者必会的基础知识盘点

    你会Vue吗,你看以下知识点你掌握了多少?实际工作中是否运用的得心应手?如果是,那么恭喜你! Vue中的数据和DOM已经被关联起来,所有的东西都是响应式的.注意我们不再和HTML直接交互.一个Vue应 ...

  3. less : 写一个display:flex的mixin

    和scss一样,less也是一个好用的css预处理语言,语法也很相近. 而我们在使用display:flex的时候,很容易苦恼于里面的设置的单词很难记(尤其是对我这种英语很差的人来说). 所以我们可以 ...

  4. Jexl表达式引擎-根据字符串动态执行JAVA.md

    Table of Contents generated with DocToc 一.使用场景 二.市面上表达式引擎比较 2.1 Aviator 2.2 Jexl 一.使用场景 在做某些项目的时候,有时 ...

  5. springAOP的三种实现方式

    springAOP的实现方式 三种 纯XML方式,XML+注解,纯注解方式. Spring 实现AOP思想使⽤的是动态代理技术 默认情况下, Spring会根据被代理对象是否实现接⼝来选择使⽤JDK还 ...

  6. Python实现初始化不同的变量类型为空值

    常见的数字,字符,很简单,不多解释. 列表List的其值是[x,y,z]的形式 字典Dictionary的值是{x:a, y:b, z:c}的形式 元组Tuple的值是(a,b,c)的形式 所以,这些 ...

  7. 面试题四十二:连续子数组的最大和,要求时间复杂度为 n

    方法一:举例分析数组的规律,累加数组逐步保存最大值:累加中和<0,则遗弃前面的累加和:重新开始: int FindMaxArray(int [] A) {               if(A= ...

  8. log4j日志打印级别动态调整

    1,为什么日志打印级别要动态调整? 随着项目越来越大,访问量也越来越高,遇到问题时想要排查,可是日志一打开却刷的太快太快,不好排查问题,有的时候甚至因为短时间打印日志太多,严重影响了性能,这个时候日志 ...

  9. 「从零单排canal 06」 instance模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  10. 如何单页面不引用移动端的适配 (postcss)

    由于pc端移动端同时开发所以同时有vant跟elementui,我的pc端登录界面直接引用之前项目做的 因为postcss全局引用,全局的px会自动转换自适应,然后页面的布局就呈现了放大的趋势, 查阅 ...