枚举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 红色为 ...
随机推荐
- 学号20155311 2016-2017-2 《Java程序设计》第9周学习总结
学号 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 整合数据库 JDBC(Java DataBase Connectivity)即java数据库连接,是一种 ...
- linux常用命令:sort 命令
sort 命令是Linux系统下一种对文件排序的工具,sort 命令功能十分强大,是 Shell 脚本编程是常用的文件排序工具. 1.命令格式: sort [选项]... [文件]... 或:sort ...
- 下载及安装selenium IDE
安装方法1:可以从官方网站下载:http://seleniumhq.org/download/,但是由于selenium服务器在美国,中美的网络经常不稳定,经常会连接失败,导致下载不了 可以找一下se ...
- hue, saturation, and brightness:色调、饱和度和亮度
色调.饱和度和亮度(hue, saturation, and brightness)以人对红.绿.蓝(RGB)三色组合的感觉为基础.在描述阴极射线管显示器参数时,经常提到这三个专有名词.所有的颜色可以 ...
- Oracle查询session连接数和inactive以及 概要文件IDLE_TIME限制用户最大空闲连接时间
-----############oracle会话和进程################----------------查询会话总数select count(*) from v$session;--查 ...
- 20145101《Java程序设计》第三周学习总结
20145101 <Java程序设计>第3周学习总结 教材学习内容总结 本周进行的是第四章和第五章的学习.本阶段的学习难度有所提升,无论是在知识的量还是深度都开始增加,内容很丰富,也很有趣 ...
- 20145334赵文豪《网络攻防》 MSF基础应用
实践目标 掌握metasploit的基本应用方式 掌握常用的三种攻击方式的思路. 实验要求 一个主动攻击,如ms08_067 一个针对浏览器的攻击,如ms11_050 一个针对客户端的攻击,如Adob ...
- 《将博客搬至51CTO》
想把你的博客搬家到51CTO吗?想拥有一键式搬家的体验吗? 就算家大业大不好搬也没关系,我们帮你! 51CTO推出专业的搬家工具,用最短的时间.最快的速度,为你在这儿搭建一个温馨的家. 在这儿,你可以 ...
- STM32.定时器
一.定时器分类 11个定时器: 定时器: 1.8 高级(7路PWM输出) 2.3.4.5 通用(4路) 6.7 基本 2个看门狗 1个sysTick 时钟分布: 二.这里我们主要对定时器中 定 ...
- BZOJ 1063 道路设计(树形DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1063 题意:给出一个无环图( 也就是树,但是也有可能是森林),代表一个国家的城市.1是首 ...