查找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. System V共享内存

    目录 1. 概述 2. System V共享内存API shmget shmat shmdt shmctl 3. 简单的程序 代码实现 common.h shmcreate.c shmrmid.c s ...

  2. [nginx] nginx源码分析--框架概览

    ALLINONE 所有我分析到的内容,都花在了一张图里. 其中包括: 1.  核心config数据结构. 2.  模块类关系图. 3. 配置类关系图. 4. 主要模块的实例化实体关系图. 5. htt ...

  3. Flink原理(四)——任务及调度

    本文是博主阅读官网文档.博客及书籍后自己所思所得,若是存在有误的地方,欢迎留言分享,谢谢! 一.任务调度 Flink是通过task slot的来定义执行资源的,为优化资源的利用率,Flink通过slo ...

  4. Red Hat Enterprise Linux 8正式发布

    现在CENTOS 8还没有发布. 了解其主要特点. https://developers.redhat.com/blog/2019/05/07/red-hat-enterprise-linux-8-n ...

  5. keras模块学习之层(layer)的使用-笔记

    本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! keras的层主要包括: 常用层(Core).卷积层(Convolutional).池化层(Pooling).局部连接层.递归层(R ...

  6. sql:拼接字符串、截取字符串、取字符串长度

    --第一段 SELECT substr('1233***6795', 0, (select instr('1233***6795', '***', 1, 1) from dual) - 1) from ...

  7. 行为型模式(七) 策略模式(Stragety)

    一.动机(Motivate) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也是一个性能负担.如何在运行时 ...

  8. Fiddler——如何抓取PHP的curl请求

    前言 本文主要介绍如何使用fiddler工具,来进行抓取PHP的curl请求,如果你会使用fiddler,那就是一行代码的事, 不会也没事,本文会教你如何简单的使用. 步骤 代码 设置桥接网络为127 ...

  9. mysql导出PDM文件步骤

    打开mysql把表导出成sql文件(如:service.sql) powerdesigner:选择 File--->Reverse Engineer--->Database 重命名(mod ...

  10. stm32f103c8t6 怎么使用IAP下载程序

    首先下载官方STM32F10X的IAP Bootloader源码,STM32F10x_AN2557_FW_V3.3.0. 用Keil4打开工程代码STM32F10x_AN2557_FW_V3.3.0P ...