【发布时间】:2014-12-12 01:24:35
【问题描述】:
use warnings;
use strict;
my $in=<STDIN>;
my @array=(1...$in);
foreach my $j(2...sqrt($in)){
for(my $i=$j*2;$i<=$in;$i+=$j){
delete($array[$i-1]);
}
}
delete($array[0]);
open FILE, ">","I:\\Perl_tests\\primes.dat";
foreach my $i (@array){
if($i){
print FILE $i,"\n";
}
}
我确信有更好的方法来处理所有数字的数组,但是我真的不知道在 perl 中可以做到这一点。我对perl非常缺乏经验。非常感谢任何加快速度的建议。非常感谢!
【问题讨论】:
-
sub sieve{grep{@_[map$a*$_,2..@_/($a=$_)]=0if$_[$_]>1}@_=0..pop}(by tily) -
@ysth 你能解释一下它是如何工作的或解释它的作用吗?
-
我可以,但这可能是个坏主意 :) 你的代码更容易理解
-
@ysth 好的,谢谢!您对摆脱大量占用过多内存的数组有什么建议吗?数字 99,999,999 需要将近 8GB 的 RAM
-
这是一个与速度问题不同的问题;看看在长字符串上使用 Bit::Vector (或者只是 vec() )
标签: perl optimization primes sieve-of-eratosthenes