查找N内的所有素数,首先想到的就是:

    对整数N从2开始到sqrt(N),进行整除计算,能整除则计算N+1,然后循环。方法简单,但效率低下。1000,000内的素数个数:

#!/usr/bin/perl -w
use strict;
my $num=;
my $count=;
while($num>){
my $i=sqrt($num);
my $j=;
for(;$j<=$i;$j++){
last if(==$num%$j);
}
$count++ if($j>$i);
$num-=;
}
print $count,"\n";

    执行时间:   

[root@centos1 pl_script]# time perl test.pl 

real    0m21.230s
user 0m21.150s
sys 0m0.049s

  对比C程序的同等算法:

#include <stdio.h>
#include <math.h>
#define NUM 1000000
main(){
int i=,j=,cnt=;
for(;i<=NUM;i+=){
int k=sqrt(i);
for(j=;j<=k;j++){
if(i%j==)break;
}
if(j>k)cnt++;
}
printf("%d\n",cnt);
}

  执行效率:

[root@centos1]# time ./prime

real    0m0.376s
user 0m0.355s
sys 0m0.017s

  C语言果然快,不算好的算法速度也是杠杠的。

  改进算法:排除所有素数的倍数,剩下的就是素数了。

  使用一个数组,下标与1000,000内的数一一对应,

  1、将数组中所有偶数下标值置0;

  2、从3开始,将所有3的倍数下标置0;

  3、循环,将全部素数的倍数下标置0

  代码如下:

#!/usr/bin/perl -w
use strict;
use constant NUM=>;
# 新建数组,下标与数字一一对应,并排除偶数
my @arr=map{$_%?$_:}(..NUM);
$arr[]=;
# 从3开始,排除3的倍数
for(my $i=;$i<=sqrt(NUM);$i+=){
my $k=$i+$i; # n的2倍
while($k<NUM){
$arr[$k]= if($arr[$k]);
$k+=$i; # n的N倍
}
}
# 选出不为0的
@arr=grep{$_}@arr;
print scalar(@arr),"\n";

  测试输出:

[root@centos1 pl_script]# time perl prime.pl 

real    0m2.714s
user 0m2.422s
sys 0m0.266s

  C同等算法:

#include <stdio.h>
#include <math.h>
#define NUM 1000000
char arr[NUM+];
main(){
int cnt=,i=,j=;
float k=sqrt(NUM);
for(i=;i<=NUM;i+=)arr[i]=;
for(i=;i<=NUM;i+=)arr[i]=;
for(i=;i<=k;i+=)
for(j=i+i;j<=NUM;j+=i)
if(arr[j])arr[j]=;
for(i=;i<=NUM;i++)
if(arr[i])cnt++;
printf("%d\n",cnt);
}

  效率如飞:

[root@centos1]# time ./enhance_prime

real    0m0.069s
user 0m0.046s
sys 0m0.022s

  趣味:正则表达式计算质数:

    ^1?$|^(11+?)\1+$

    表达式中有“|”,也就是说这个表达式可以分成两个部分:/^1?$/ 和 /^(11+?)\1+$/

  第一部分:/^1?$/, 其表示匹配“空串”以及字串中只有一个“1”的字符串。

  第二部分:/^(11+?)\1+$/,这个部分是整个表达式的关键部分。其可以分成两个部分,(11+?) 和\1+$,前半部很简单了,匹配以“11”开头的并重复0或n个1的字符串,后面的部分意思是把前半部分作为一个字串去匹配还剩下的字符串1次或多次(这句话的意思是——剩余的字串的1的个数要是前面字串1个数的整数倍)。

  要使用这个正规则表达式,需要把自然数转成多个1的字符串,如:2 要写成 “11”, 3 要写成 “111”,以下是perl表达式:

  perl -e '$|=1;(1x$_)!~/^1?$|^(11+?)\1+$/ && print"$_ " while ++$_'

Perl快速查找素数的更多相关文章

  1. 【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N ...

  2. nyoj_187_快速查找素数_201312042102

    快速查找素数 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数.   输入 ...

  3. NYOJ--187--快速查找素数(筛选法,素数打表)

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数.   输入 给出一个正整数数N ...

  4. nyoj---快速查找素数

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数.   输入 给出一个正整数数N ...

  5. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  6. [SQL Server]如何快速查找使用了某个字段的所有存储过程

    [SQL Server]如何快速查找使用了某个字段的所有存储过程       当一个系统中使用了很多的表,并且存在大量的存储过程,当数据库中的某个表删除了某个字段,那么相应的存储过程也需要改动,但是我 ...

  7. lucene如何通过docId快速查找field字段以及最近距离等信息?

    http://www.cnblogs.com/LBSer/p/4419052.html 1 问题描述 我们的检索排序服务往往需要结合个性化算法来进行重排序,一般来说分两步:1)进行粗排序,这一过程由检 ...

  8. Eclipse添加快速查找Dao中方法所对应的Mybatis XML映射SQL的插件

    Dao关联Mybatis快速查找的插件安装地址:http://dl.bintray.com/harawata/eclipse 安装步骤: ①Eclipse ==> Help ==> Ins ...

  9. HDOJ 1397 Goldbach's Conjecture(快速筛选素数法)

    Problem Description Goldbach's Conjecture: For any even number n greater than or equal to 4, there e ...

随机推荐

  1. IDEA设置项目文件自动Add到Svn/Git

    1)配置自动Add 2)将未添加的文件添加到本地 3)取消已经添加的文件

  2. Failed to close the ServletOutputStream connection cleanly, Broken pipe

    Problem1: 服务端报错:Broken pipejava.io.IOException: Connection timed out at sun.nio.ch.FileDispatcherImp ...

  3. nodejs模块化标准

    commonjs 导出一个 a.js function add(a, b){ return a+b; } module.exports = add; b.js const add = require( ...

  4. 李航-统计学习方法-笔记-3:KNN

    KNN算法 基本模型:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例.这k个实例的多数属于某个类,就把输入实例分为这个类. KNN没有显式的学习过程. KNN使用的模型 ...

  5. Ajax -异步请求 -jquery中ajax分类 -第一层 $.ajax -第二层($.get /$.post) -第三层($.getJson/$.getScript) -相应演示

    Ajax 1.标准请求响应时浏览器的动作(同步操作) 1.1浏览器请求什么资源,跟随显示什么资源2.ajax:异步请求. 2.1局部刷新,通过异步请求,请求到服务器资源数据后,通过脚本修改页面中部分内 ...

  6. python网络-动态Web服务器案例(30)

    一.浏览器请求HTML页面的过程 了解了HTTP协议和HTML文档,其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作 ...

  7. 《Exceptioning团队》第四次作业:项目需求调研与分析

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.探索团队软件项目需求获取技巧与方法2.学会 ...

  8. webpack loader和插件的编写原理

    webpack自定义loader和插件的api网址:https://www.webpackjs.com/api/loaders/ 点击顶部API,看左侧api: 1. 如何编写一个loader 实现的 ...

  9. PL/sql配置相关

    可以安装oracle之后,打开PL/sql之后,自动找到oracle的路径以及数据库连接.   或者:安装oracle客户端,手动在PL/sql中配置oic以及oracle主目录的位置,并且配置好C: ...

  10. 第122题:买卖股票的最佳时机II

    一. 问题描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交 ...