您的位置:首页 > 其它

欧拉计划35题:100万以下有多少个循环质数?附模块 Math-Prime-Util的使用:17秒的差距::思考总能学习新的东西,思考总能得到好的结果

2012-12-20 22:17 246 查看
这里程序其实还有很多的问题,首先,求100000以内的素数有一个专门的模块,明天好好研究一下,再做总结,

其次,循环数的遍历一块,很啰嗦,但是还没有找到更好的方法,这个也需要优化。

我们称197为一个循环质数,因为它的所有轮转形式: 197, 971和719都是质数。

100以下有13个这样的质数: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 和97.

100万以下有多少个循环质数?

程序如下:

my $start_time=time;
my %hash;
my $i;
my $flag;

#**************************************************#
#************以下获取100万以下的质数库*************#
for($i=11;$i<1000000;$i+=2)
{
if($i%3==0)
{
next;
}
else
{
$flag=0;
foreach(2..$i**0.5+1)
{
if($i%$_==0)
{
$flag=1;
last;
}
else
{
next;
}
}
if($flag==0)
{
$hash{$i}=$i;
}
}
}
#*************************************************#
use Algorithm::FastPermute('permute');

my $array;
my $all;
my @all;
my @array=  keys %hash;
my $cout=4;
foreach $array(@array)
{
my @separt=split//,$array;
$all[0]=$array;
$all[1]=join "",$separt[1],$separt[2],$separt[3],$separt[4],$separt[5],$separt[0];
$all[2]=join "",$separt[2],$separt[3],$separt[4],$separt[5],$separt[0],$separt[1];
$all[3]=join "",$separt[3],$separt[4],$separt[5],$separt[0],$separt[1],$separt[2];
$all[4]=join "",$separt[4],$separt[5],$separt[0],$separt[1],$separt[2],$separt[3];
$all[5]=join "",$separt[5],$separt[0],$separt[1],$separt[2],$separt[3],$separt[4];
$flag=0;
foreach $all(@all)
{
if(exists$hash{$all})
{
next;
}
else
{
$flag=1;
last;
}
}
if($flag==0)
{
$cout=$cout+1;
}
else
{
next;
}
}
print "$cout\n";
my $long=time-$start_time;
print "$long\n";


结果如下:

用时18s

C:\WINDOWS\system32\cmd.exe /c perl "C:\Documents and Settings\Administrator\桌
面\b.pl"
55
18
Hit any key to close this window...

然后我们修改程序,我们把获取素数的部分进行替换:

程序如下:

my $start_time=time;
use Math::Prime::Util ':all';
my $hash;
my @primes=@{primes(1000000)};
foreach $primes(@primes)
{
$hash{$primes}=$primes;
}

use Algorithm::FastPermute('permute');

my $array;
my $all;
my @all;
my @array= keys %hash;
my $cout=0;
foreach $array(@array)
{
my @separt=split//,$array;
$all[0]=$array;
$all[1]=join "",$separt[1],$separt[2],$separt[3],$separt[4],$separt[5],$separt[0];
$all[2]=join "",$separt[2],$separt[3],$separt[4],$separt[5],$separt[0],$separt[1];
$all[3]=join "",$separt[3],$separt[4],$separt[5],$separt[0],$separt[1],$separt[2];
$all[4]=join "",$separt[4],$separt[5],$separt[0],$separt[1],$separt[2],$separt[3];
$all[5]=join "",$separt[5],$separt[0],$separt[1],$separt[2],$separt[3],$separt[4];
$flag=0;
foreach $all(@all)
{
if(exists$hash{$all})
{
next;
}
else
{
$flag=1;
last;
}
}
if($flag==0)
{
$cout=$cout+1;
}
else
{
next;
}
}
print "$cout\n";
my $long=time-$start_time;
print "$long\n";


结果就只用了1秒钟
C:\WINDOWS\system32\cmd.exe /c perl "C:\Documents and Settings\Administrator\桌
面\c.pl"
55
1
Hit any key to close this window...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐