枚举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 红色为 ...
随机推荐
- UVM中的driver组件
一般UVM环境中的Driver组件,派生自uvm_driver. uvm_dirver派生自uvm_component. class uvm_driver #(type REQ = uvm_sequ ...
- Functional Programming 资料收集
书籍: Functional Programming for Java Developers SICP(Structure and Interpretation of Computer Program ...
- python 代码覆盖率 coverage用法
先装coverage: D:\test_python\e8_test>pip install coverageCollecting coverage Downloading https://f ...
- ajax return true/false无效原因
错误示例:function checkCP(customerId,productId){ $.ajax({ url:"/cp/checkCP", type:"post&q ...
- java service wrapper日志参数设置及优化
一般在容器比如tomcat/weblogic中运行时,我们都是通过log4j控制日志输出的,因为我们现在很多服务端使用java service wrapper(至于为什么使用jsw,原先是比较排斥使用 ...
- 20145101《Java程序设计》第5周学习总结
20145101<Java程序设计>第5周学习总结 教材学习内容总结 第八章 异常处理 Java是通过try,catch,throw,throws,finally这5个关键字来实现异常处理 ...
- 日志统计|2018年蓝桥杯B组题解析第八题-fishers
标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞" ...
- IDEA,RubyMine等JetBrains系列软件通用破解教程
此教程不光适用于IDEA,还可以在RubyMine等JetBrains系列软件使用,亲测可用. (1)下载安装你需要的JetBrains系列软件,安装完最好不要打开,直接finish,断开网络. (2 ...
- TeeChart入门
此链接可以作为参考http://tech.sina.com.cn/s/2008-07-07/1612722495.shtml 需要添加引用 using Steema.TeeChart;//tchart ...
- 【源码编译】spark源码编译
本文采用cdh版本spark-1.6.0-cdh5.12.0 1.源码包下载 2.进入根目录编译,编译的方式有2种 maven mvn clean package \ -DskipTests -Pha ...