欧拉计划35题:100万以上有多少个循环质数?附模块 Math-Prime-Util的使用:17秒的差距:思考总能学习新的东西,思考总能得到好的结果
欧拉计划35题:100万以下有多少个循环质数?附模块 Math-Prime-Util的使用:17秒的差距::思考总能学习新的东西,思考总能得到好的结果
结果就只用了1秒钟
这里程序其实还有很多的问题,首先,求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...