枚举1--求小于n的最大素数
枚举1--求小于n的最大素数
总结:
素数是不能被比它小的素数整除。
/*
枚举就是基于已有知识镜像答案猜测的一种问题求解策略 问题:求小于n的最大素数 分析:
找不到一个数学公式,使得根据N就可以计算出这个素数 我们思考:
N-1是素数么?N-2是素数吗?... 所以我们就是判断N-K是否为素数:
N-K是素数的充分必要条件:N-K不能被[2,n-k)中任何一个整除 判断N-K是否为素数的问题可以转化为:
求小于N-K的全部素数(求“小于N的最大素数”中的条件是“n不能被[2,n)中任意一个素数整除”,而不是整数)
不能被[2,n)中任意一个素数整除的数一定是素数,因为那些整数都是以素数为因子的,
所以没必要检测所有整数,检测所有素数就ok了 解决方法:
2是素数,记为PRIM 0
根据PRIM 0,PRIM 1,...PRIM K,寻找比PRIM K大的最小素数PRIM K+1(这里是根据素数找素数)
如果PRIM K+1大于N,则PRIM K是我们需要找的素数,否则继续寻找 枚举:
从可能的集合中一一列举各元素
根据所知道的知识,给一个猜测的答案
比如:2是素数,那2是本问题的解么 枚举算法:
对问题可能解集合的每一项:
根据问题给定的检验条件判断哪些是成立的
使条件成立的即为问题的解 枚举过程:
判断猜测答案是否正确
2是小于N的最大素数么?
进行新的猜测:
有两个关键因素要注意:
1. 猜测的结果必须是前面的猜测中没有出现过的。每次猜测的素数一定要比已经找到的素数大
2. 猜测的过程中要及早排除错误的答案。比如:除2之外,只有奇数才可能是素数 枚举过程中需要考虑的问题:
1. 给出解空间,建立简介的数学模型
可能的情况是什么?
模型中变量数尽可能的少(使规模尽量小),他们之间相互独立
求“小于N的最大素数”中的条件是“n不能被[2,n)中任意一个素数整除”
而不是“n不能被[2,n)中任意一个整数整除”
2. 减少搜索的空间
利用知识缩小模型中各变量的取值范围,避免不必要的计算
比如:较少代码中循环体执行的次数
除2之外,只有奇数才可能是素数,{2,2*i+1|1<=i,2*i+1<n}
3. 采用合适的搜索顺序
搜索空间的遍历顺序要与模型中条件表达式一致
例如:对{2,2*i+1|1<=i,2*i+1<n},按照从小到大的顺序 枚举关键字(枚举核心):
减少规模 */ #include <iostream>
using namespace std;
int prim[];//用来存所有素数
int primNum=;//用来记录 prim数组中已经存入的素数的数量
int times=; //用于记录求解问题的总共判断次数
int primLessN(int n);
int primLessN_2(int n);
bool isPrimMothed(int n); //判断一个数是否为素数 /*
方法一:由前往后用素数判断的枚举法:
求“小于N的最大素数”中的条件是“n不能被[2,n)中任意一个素数整除”,而不是整数 当n=10 0000时,
ans=99991
times=4626 4478次
primNum=9592 我每一个素数被判断出来,都要遍历一下之前的素数表
而判断10 0000的时候,外层循环走了50000,里层每一个素数就是一次之前素数表的遍历
50000*(1+2+3+...+9592)=50000* 4600 8082
前面那个数没有50000,还要减去那些非素数
从 50000* 4600 8082可以看出,主要是之前那些素数花的时间,非素数几乎没花时间
非素数= 4626 4478-4600 8082= 25 6450
只有25万,虽然还是要比下面多很多,因为是从前往后比较的
*/
int primLessN(int n)
{
prim[]=; //2是最小的素数
primNum++;
for(int i=;i<n;i+=){
bool isPrim=; //isPrim用来判断一个数是否为素数
for(int j=;j<primNum;j++){
times++;
if(i%prim[j]==){
isPrim=;
break; //没加break之前, 当n=10 0000时,times=2 5239 6936次 (2.5亿) ,加了之后times=4626 4478次 (4.5千万次)
} }
if(isPrim) prim[primNum++]=i;//如果是素数,则存入prim素数数组
}
return prim[primNum-];
} /*
方法二: 由后往前的整数枚举法
而且方法二的空间消耗也少 当n=10 0000时,
ans=99991
times=346次 当n=100 0000时,用方法一的话,根本算不出来
ans=99 9983
times=1811次 当n=1 0000 0000(一亿)时,
ans=9999 9989
times=11314次 当n=10 0000 0000(十亿)时,
ans=9 9999 9937
times=52537次
*/
bool isPrimMothed(int n){
bool isPrim=; //isPrim用来判断一个数是否为素数
if(n==||n==) return ;
for(int i=;i*i<=n;i++){
times++;
if(n%i==) return ;
}
return ;
} int primLessN_2(int n){
for(int i=n;i>=;i--){
if(isPrimMothed(i)) return i;
}
}
int main(){
int n;
scanf("%d",&n);
//int ans=primLessN(n);
int ans=primLessN_2(n);
cout<<ans<<endl;
printf("总判断次数times:%d\n",times);
printf("总素数数primNum:%d\n",primNum);
return ;
}
代码运行结果在注释里有。
枚举1--求小于n的最大素数的更多相关文章
- 求小于10000的素数的个数 Exercise06_10
/** * @author 冰樱梦 * 时间:2018年下半年 * 题目:求小于10000的素数的个数 * */ public class Exercise06_10 { public static ...
- 求出100以内的素数(java实现)
j package test1; //2018/11/30 //求100以内的所有素数 public class Main10 { public static void main(String[] a ...
- 求0到n之间素数个数的序列
要求: (1) 找出0-1000之间素数(2) 设f(n)表示0-n之间的素数个数,计算出当n=0,1,2,3,.....,997时f(n)的值,并写入文件 分析: 首先找素数使用一个效率较高的方法- ...
- python3 filter用法(举例求0~n之间的素数)
在用python3求0~n之间的素数时,关于filter用法的有点模糊,于是上网查了一下filter用法. 求0~n之间素数的脚本prime.py: def f(x): plist = [0,0] + ...
- COJ 3018 求1~n之间的素数
求1~n之间的素数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 素数是大于1,且除1和本身以外不能被其他整数所整除的数. ...
- vb实验7-找出小于18000的最大素数
vb实验7-找出小于18000的最大素数 vb实验7-找出小于18000的最大素数 ---–写给女朋友的题解 在窗体上画一个文本框,名称为TEXT1,两个命令按钮,C1和 C2,标题分别为" ...
- 求n到m之间素数的个数
Description 求n到m之间素数的个数 Input 多组测试数据,每组先输入一个整数t,表示组数,然后每组输入2个正整数n和m,(1 <= n <= m <= 10000) ...
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
关于素数的基本介绍请参考百度百科here和维基百科here的介绍 首先介绍几条关于素数的基本定理: 定理1:如果n不是素数,则n至少有一个( 1, sqrt(n) ]范围内的的因子 定理2:如果n不是 ...
- 筛选法求n以内所有的素数
求n以内所有的素数? 筛选法:将2到n中所有的数都列出来,然后从2开始,先化掉所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其内所有的倍数,最后剩下来的数就都是素数 例:13 红色为 ...
随机推荐
- zw版【转发·台湾nvp系列Delphi例程】HALCON Regiongrowing
zw版[转发·台湾nvp系列Delphi例程]HALCON Regiongrowing procedure TForm1.Button1Click(Sender: TObject);var img : ...
- 360在线网站安全检测,web安全测试AppScan扫描工具,XSS常用的攻击手法
360在线网站安全检测,web安全测试AppScan扫描工具,XSS常用的攻击手法 如何做好网站的安全性测试 360网站安全检测 - 在线安全检测,网站漏洞修复,网站后门检测http://websca ...
- php抛出异常
php抛出异常:throw new Exception("xxxxxx!"); 实例代码: try{ if ($mysqli->connect_errno) { sleep( ...
- java多线程-----volatile
谈谈Java中的volatile 内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中, ...
- EXKMP
(我和lesphere,reverse研究了这个东西一上午)QAQ kmp是求字符串S的任意前缀与字符串T的最长的相同的前缀和后缀 exkmp第求字符串S的任意后缀与字符串T的最长公共前缀 与kmp相 ...
- iotop监控磁盘动态安装
开始装iotp tar xvf iotop-0.3.1.tar.gz 用python安装(如果没有蟒蛇, yum一个吧) cd iotop-0.3.1 python setup.py build py ...
- 20145309李昊《网络对抗技术》实验9 web安全基础实践
本实验在同学帮助下完成 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前 ...
- devicePixelRatio手机图片模糊的原因
一.移动设备图片模糊问题 手机上图片模糊问题原因就是一个像素在电脑上和手机上代表的实际像素的不同. 我们在样式表中使用的px(独立像素)单位其实并不一定代表着实际的一个像素(物理像素),这还要看硬件的 ...
- vijos 1096 津津的储存计划
题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以 ...
- Mysql数据库基础知识
什么是Mysql数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQ ...