学习目标:

每天睡前是否感到浑浑噩噩,一天又在不知不觉中过去,回想我今天都干了什么呢?

啊~我这一天又什么也没干,好有罪恶感啊,不行,我明天一定要好好学算法(手动狗头)。

明日复明日,明日何其多?不要等明天啦,和小编一起,每天睡前一道算法题,不仅解决你一天的空虚,更能助你安心入眠,远离熬夜。还能学到一点算法知识。不要小看这些知识哦,不积跬步无以至千里,不积小流无以成江海。每位大佬都不是一夜成名,都是从小白做起,日积月累,终成大佬,和小编一起,每日一题,走向大佬之路吧!


学习内容:

我们的题基本都是一些较为基础,适合日(睡)常(前)看的题,不会让你一眼就看出答案,是稍稍一点脚就能摸到头绪,但是在想的过程中又一时不知如何实现,再一想,又柳暗花明,最终跟着小编的思路一起解决问题,有不同思路可以发在评论区,一起讨论。“你若在,我必回”。


我们今天的题目是孪生素数对,首先,介绍一下什么是素数

简单来说,素数是只能被1和它本身整除的数。其中特例是:0和1既不是素数也不是合数,2是素数。

那么我们首先来思考,如何判断一个数n是不是素数。第一想法应该是一个循环,从2到 n-1进行判断,如果存在一个数能整除,则不是素数,反之则是素数。对吧,让我们看看代码。

int prime(int n){int i;for(i=2;i<n;i++){if(n%i==0){return 0;//不是素数 }}return 1;//是素数
}

虽然这样是没错的,但是我们想一下,从2到n,是不是需要判断的太多了,会有很多没用的判断。那么如何减少没用的判断,就要先思考没用的判断从何而来,以36为例:它的因子有2,3,4,6,9,12,18,可以知道,它的因子一定是成对出现,而特殊的6,其实准确来说是6*6,也恰好是6,将这些成对出现的因子分成两半。说到这里,相信你一定发现了吧,我们的循环只需要判断到根号n,就能发现它的全部因子对。代码也只需要将判断条件改为根号n。

int t=sqrt(n);
for(i=2;i<=t;i++){if(n%i==0){return 0;//不是素数 }}

这里为了减少每次判断都需重新计算根号n,所以提前将他计算得到。


到此,我们所能想到的大概就是这些了,但是当n特别大的时候,即使是根号n,仍然会很大。那么还有没有什么更好的方法去优化它,当n=1000000时,开根得1000,还会有90,91,92,93等数字,我们明知道它们不可能时n的因子,但还是要进行无用的判断。所以,如何避免这些没用的判断呢?

如果你做过很多这样的题,见到过很多素数,你会发现这样的一个规律:素数一定是在6的倍数两侧出现,2,3除外。有关这个定理的证明,相信属性小编的朋友一定都知道,小编是一个实用主义者,交给你最干的干货,让你看完就能用,这个定理的证明不需要我们的掌握,所以就不加赘述。那么我们看看这个定理应该怎么用代码实现。

#include<stdio.h>
#include<math.h>
int prime(int n){if(n==2 && n==3) return 1;if(n%6==5 || n%6==1){int t=sqrt(n)+1,i;for(i=2;i<t;i++){if(n%i==0){return 0;}}return 1;}return 0;
}
int main() {int k;scanf("%d",&k);printf("%d\n",prime(k));//1是 0否
}

这个判断方法已经可以快速判断一个数是不是素数,但是还要经过进行多次判断。

人类的思维总是在不断追求完美的过程中逐渐提高,那么我们还能不能有更快的方法,让我们一次就能将判断结果得出。也就是O(1),看到这个复杂度,不知道你有没有想到桶排序?就是将每个数存放在数组中。

没错,那个方法就是打表!!!由于素数的个数随着n的不断增大会减少,我们可以通过打表的方法将每一个素数放在数组中。

那么如何实现呢?其实我们可以通过两个基本数相乘,得到一个合数,并将它在数组中标记。2*2,2*3,2*4...3*2,3*3,3*4...通过将每一个合数标记,那么剩下的未标记的数就是素数了。用代码实现就是:

int prime(){int max=10001;int i,j,num[max];for(i=0;i<max;i++){num[i]=0;}num[0]=num[1]=-1;for(i=2;i<max;i++){for(j=2*i;j<max;j+=i){num[j]=1;}}for(i=0;i<max;i++){if(num[i]==0){printf("%d ",i);}}
}

以上就是我们常用并且高效的判断质数的方法,可以收藏以备不时之需

接下来我们通过孪生质数这个题目,来实战一下吧!

问题描述

  差为2的两个素数被称为孪生素数对,例如3和5, 11和13.
  给定一个区间,请输出区间内所有的孪生素数对.

输入格式

  两个正整数a,b,其中a<b,以空格分开

输出格式

  区间[a,b]内的所有孪生素数对,按从小到大顺序。每行一个素数对,其中小的在前,大的在后,以空格分开。
  如果区间内没有素数对的话,输出-1.

样例输入

2 15

样例输出

3 5
5 7
11 13

样例输入

14 18

样例输出

-1

看完题目,相信大家一定知道该如何去做了吧。没错,就是我们高效且暴力的打表,将[a,b]内的所有数放在数组,进行打表,就可以知道那些是合数,那些是素数了。最后通过判断 i 和 i+2是不是都是素数,是则输出,并对ans=1作为标记区间内出现素数,不是则过,循环判断结束后,再判断是否出现素数,若未出现即ans=0,输出-1,否则结束。

看看代码如何实现:

#include<stdio.h>
void prime(int *num,int b) {num[1]=1;int i,j;for(i=2; i*i<=b; i++) {if(!num[i]) {for(j=i*i; j<=b; j+=i) {num[j]=1;}}}
}
int main() {int a,b,i,ans=0;scanf("%d%d",&a,&b);int num[b+1];for(i=0; i<=b; i++) {num[i]=0;}prime(num,b);for(i=a; i<=b-2; i++) {if(!num[i] && !num[i+2]) {printf("%d %d\n",i,i+2);ans=1;}}if(!ans){printf("-1");}return 0;
}

欢迎大家订阅小编的每日一题专栏,会每天更新,都是用心准备的哦!

若有不同思路,欢迎评论区留言,看到必回,Goodnight!

每日一题——孪生素数对(教你如何高效判断素数,判断素数的全部方法)相关推荐

  1. 老男孩教育每日一题-2017年4月28日- MySQL主从复制常见故障及解决方法?

    MySQL主从复制常见故障及解决方法? 1.1.1故障1:从库数据与主库冲突 show slave status; 报错:且show slave status\G Slave_I/O_Running: ...

  2. c++运用函数求孪生素数对

    孪生素数对是指差为2的一对素数 #include<iostream> #include<cmath> using namespace std; int pri(int n) / ...

  3. (每日一题)P3768 简单的数学题(确信)(莫反 + 欧拉反演 + 杜教筛 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.20 莫反 和上午的那道题比较类似的 ...

  4. delphi 多个线程 多个进度条_多线程有哪些优点?- Python每日3题(多线程专题)

    这里是Python7编程挑战-多线程专题! 每天学习3个问题,包括初级,中级,高级问题各1个. 今天是第2天!一起来呀,就7天! 每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一 ...

  5. python3 多线程 threading.local 代理_threading.local的作用?Python每日3题(多线程专题)...

    这里是Python7编程挑战-多线程专题! 每天学习3个问题,包括初级,中级,高级问题各1个. 今天是第5天!一起来呀,就7天!每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道 ...

  6. 对数函数定义域和值域_呆哥数学每日一题 —— 复合函数值域

    如果想要获取往期每日一题电子版,可以加我微信:daigemath366,备注:知乎 每日一题 呆哥解析:这是一个函数和复合函数的综合问题 首先我们先把原函数的值域求出来 先直接求导: 导数不容易判断单 ...

  7. 每日一题(进制转换)

    前言:为了让小伙伴更方便的学习编程语言,小白每天都会分享一道编程题.小白也创建了一个微信公众号,会同步更新题目和相关的视觉领域的知识,如果小伙伴不方便在网页上阅读文章,可以关注微信公众号"小 ...

  8. 每日一题(合并表格)

    前言:为了让小伙伴更方便的学习编程语言,小白每天都会分享一道编程题.小白也创建了一个微信公众号,会同步更新题目和相关的视觉领域的知识,如果小伙伴不方便在网页上阅读文章,可以关注微信公众号"小 ...

  9. 每日一题(字符串拆分)

    前言:为了让小伙伴更方便的学习编程语言,小白每天都会分享一道编程题.小白也创建了一个微信公众号,会同步更新题目和相关的视觉领域的知识,如果小伙伴不方便在网页上阅读文章,可以关注微信公众号"小 ...

最新文章

  1. 贾扬清、Alex Smola、Julia创始人等大咖齐聚,WAIC开发者日共话AI未来
  2. python语言自学教程-3D图示Python标准自学教程入门篇
  3. angr学习笔记(6)(内存地址单元符号化)
  4. 【转载保存】什么是线程阻塞?为什么会出现线程阻塞?
  5. WordPress独立资源下载页面插件 基于美化Xydown插件
  6. [转] CPU GPU TPU
  7. Flipping elements with WPF
  8. canal 使用注意事项
  9. python如何实现分布式_Python如何快速实现分布式任务
  10. 鸿蒙不如安卓PPT,被吐槽为PPT、“哄蒙”、安卓套壳,华为鸿蒙一路走来真不容易...
  11. simplemind pro for Mac(思维导图)
  12. 【招】阿里云技术战略高级专家
  13. c 汇编语言小程序100例,汇编语言100例
  14. 计算机操作系统期末考试大全,计算机操作系统期末考试试题含答案
  15. 内存映射技术(共享内存)
  16. 了解 SWFObject 2.0 应用
  17. sublime在wamp下配置php文件,配置WAMP环境下的sublime和PHPdesigner
  18. 利用系统函数获取Windows明文密码
  19. 知识图谱---简单实践(学习笔记)
  20. PMP考试的5A好考吗?

热门文章

  1. 爬虫输入关键字搜索爬取图片
  2. 杠杆炒股的两种操作方法
  3. 卫星图瓦片爬取之google卫星图偏移的问题
  4. 【LINUX】libgd-GD库安装
  5. 172 Factorial Trailing Zeroes(阶乘后的零)————附带详细思路和代码
  6. 分布表示(distributional representation)与分布式表示(distributed representation)
  7. 18 个坏习惯,你一定要抛弃
  8. CPU的三种工作模式:实模式、保护模式、长模式
  9. 面向對象在VB6語言中的應用
  10. MYSQL查询之查询的多个结果重复循环出现问题分析