欧拉计划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万以下有多少个循环质数?
程序如下:
结果如下:
用时18s
然后我们修改程序,我们把获取素数的部分进行替换:
程序如下:
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...
其次,循环数的遍历一块,很啰嗦,但是还没有找到更好的方法,这个也需要优化。
我们称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...
相关文章推荐
- DL学习笔记【15】使用训练好的模型得到分类结果
- 仔细思考一个接口的不同实现得到的类和一个类的不同对象使用起来到底有什么区别?
- 例题:一对幼兔,一个月后长成小兔,小兔一个月后长成成兔并生下一对幼兔,问n个月后有多少对兔子。这个题主要是学习计算机思维,我们只需要把条件告诉计算机,让计算机算结果
- Python学习笔记之os模块使用总结
- IOS学习笔记35—Xcode4.5后国际化的使用
- Emit学习-基础篇-使用循环
- 微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块
- Maven学习总结(8)——使用Maven构建多模块项目
- 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
- 【Arduino学习笔记】使用L298N电机驱动模块驱动直流电机
- 【Visual C++】游戏编程学习笔记之三:游戏循环的使用
- 关于dubbo使用过程中抛出【java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED!】的思考
- python 学习记录(5)-变量、模块名的命名规则及random模块使用
- acmore|acmore.cc1006编写程序,显示计算的结果1007可以使用以下公式计算1008转换温度1009计算圆柱体的体积1010将英尺转换为米
- 微软企业库4.1学习笔记(二十二)加解密模块2 在应用中使用加密解密
- 2006-05-30 学习使用java.util.logging.Logger类(纪念屈原吧)
- 微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇
- 学习使用外部模块
- Rsa 非对称加密算法使用问题分享--使用通过密钥对同一段数据加密得到结果每次不一样