Perl快速查找素数
查找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快速查找素数的更多相关文章
- 【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N ...
- nyoj_187_快速查找素数_201312042102
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 ...
- NYOJ--187--快速查找素数(筛选法,素数打表)
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N ...
- nyoj---快速查找素数
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- [SQL Server]如何快速查找使用了某个字段的所有存储过程
[SQL Server]如何快速查找使用了某个字段的所有存储过程 当一个系统中使用了很多的表,并且存在大量的存储过程,当数据库中的某个表删除了某个字段,那么相应的存储过程也需要改动,但是我 ...
- lucene如何通过docId快速查找field字段以及最近距离等信息?
http://www.cnblogs.com/LBSer/p/4419052.html 1 问题描述 我们的检索排序服务往往需要结合个性化算法来进行重排序,一般来说分两步:1)进行粗排序,这一过程由检 ...
- Eclipse添加快速查找Dao中方法所对应的Mybatis XML映射SQL的插件
Dao关联Mybatis快速查找的插件安装地址:http://dl.bintray.com/harawata/eclipse 安装步骤: ①Eclipse ==> Help ==> Ins ...
- HDOJ 1397 Goldbach's Conjecture(快速筛选素数法)
Problem Description Goldbach's Conjecture: For any even number n greater than or equal to 4, there e ...
随机推荐
- webpack4 从零学习常用配置梳理
webpack 的核心价值就是前端源码的打包,即将前端源码中每一个文件(无论任何类型)都当做一个 pack ,然后分析依赖,将其最终打包出线上运行的代码.webpack 的四个核心部分 entry 规 ...
- UCOSIII钩子函数
OSIdleTaskHook 空闲任务调用这个函数,可以用来让CPU进入低功耗模式 void OSIdleTaskHook (void) { #if OS_CFG_APP_HOOKS_EN > ...
- HTTP协议复习一--认识HTTP
HTTP 是什么 HTTP 是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超文本数据的约定和规范. HTTP 是一个用在计算机世界里的协议,它确立了一种计算机之间交流通信的规范,以及相 ...
- 编写订单支付api中遇到的问题
首先我是按照已经有的已经有的支付api去编写订单支付api,但是由于两者是有区别的,所以类似去搬用难免会出问题,首先我是套用已经写好的model,然后写相应的serializer,实现序列化之后就开始 ...
- springboot2.1.3使用jdbcTemplate
这里只是备忘一下使用方式,至于配置数据源信息不在此文中讲解,忘谅解. 1. 查询返回List<Long>数据集 (这里比如返回userId,long型) @Autowired@Quali ...
- phpmyadmin教程
phpmyadmin教程 管理页进入phpmyadmin 打开C:\wamp\apps\phpmyadmin3.5.1下的配置文件:config.inc 修改密码创建与修改数据库.数据表 字段类型 I ...
- Spark 用Scala和Java分别实现wordcount
Scala import org.apache.spark.{SparkConf, SparkContext} object wordcount { def main(args: Array[Stri ...
- 【HCIA Gauss】学习汇总-数据库基础介绍-1
存放在数据库中数据的特点 :永久存储 又组织 可共享 数据库系统是由 数据库 数据库管理系统 应用程序 管理员成员 组成的存储 管理 处理和维护数据的系统 三个阶段:人工阶段 ,文件系统阶段,数据库系 ...
- Python_文件相关操作
1.open(filePath,type)方法:打开文件 filePath:文件路径 type:操作文件的方式(r:读取,w:覆盖写入,a:追加写入) 2.strip()方法:去除读取到的每行内容后的 ...
- (Linux基础学习)第四章:Linux系统中的日期和时间介绍和ntpdate命令
第1节:日期和时间1.Linux的两种时钟:系统时钟:由Linux内核通过CPU的工作频率进行的硬件时钟:主板2.相关命令date 显示和设置系统时间hwclock,clock 显示硬件时钟-s,-- ...