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 ...
随机推荐
- CDN详解
一.定义 背景: 当下的互联网应用都包含大量的静态内容,但静态内容以及一些准动态内容又是最耗费带宽的,特别是针对全国甚至全世界的大型网站,如果这些请求都指向主站的服务器的话,不仅是主站服务器受不了,单 ...
- Android笔记(六十六) android中的动画——XML文件定义属性动画
除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...
- c# 字符串修改
- keepalived实现nginx反向代理的高可用
实现keepalived调用脚本进行资源监控 keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整 vrrp_script:自定义资源监控脚本,vrrp实例根据脚 ...
- 使用Junit测试框架学习Java
前言 在日常的开发中,离不开单元测试,而且在学习Java时,特别是在测试不同API使用时要不停的写main方法,显得很繁琐,所以这里介绍使用Junit学习Java的方法.此外,我使用log4j将结果输 ...
- Python标准库-datatime和time
Python标准库-datatime和time 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.标准库datatime 1>.datatime模块 #!/usr/bin/e ...
- Linux中快速对字符串进行加密
1)进行base64的加密和解密 [root@VM_0_10_centos opt]# echo hello |base64aGVsbG8K[root@VM_0_10_centos opt]# ech ...
- 关于MQ的几件小事:如何保证消息队列的高可用
原文:https://www.cnblogs.com/jack1995/p/10908797.html 1.RabbitMQ的高可用 RabbitMQ基于主从模式实现高可用.RabbitMQ有三种模式 ...
- 用js刷剑指offer(两个链表的第一个公共结点)
题目描述 输入两个链表,找出它们的第一个公共结点. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ fun ...
- C#编译相关知识
C#代码编译成MSIL代码. 当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令.当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码.由 ...