欧拉计划37题:找出全部11个这样从左向右和从右向左都可以裁剪的质数,shift函数的学习,从别人的答案提取精华,自己的思路和扩展的思路就是两个思路
来源:互联网 发布:淘宝常用文案 编辑:程序博客网 时间:2024/06/06 07:46
题目如下:3797这个数很有趣。它本身是质数,而且如果我们从左边不断地裁去数字,得到的仍然都是质数:3797,797,97,7。而且我们还可以从右向左裁剪:3797,379,37,3,得到的仍然都是质数。
找出全部11个这样从左向右和从右向左都可以裁剪的质数。注意:2,3,5和7不被认为是可裁剪的质数。
我在做这道题的时候,因为只有11个这样的数,所以从一开始就没有去想更好的方法,而是很随意的写,到后来复杂度不断增加,当直到1000000的时候才出现第11个数。
所以做任何一个题目,都要从开始的时候规划好所有的思路。
思路其实很简单,分拆,重组成数字。然后验证这些数字是否为质数。
这里用hash来验证,大大提高了速度。同时也用到了一个专门用来着素数的模块。我们在前面已经说过了。
use strict;use warnings;use Math::Prime::Util ':all';my $sum=0;my @primes;my %hash;my $num;my $length;my $primes;my @num;my $first_two;my $last_two;my $first_three;my $last_three;my $first_four;my $last_four;my $first_five;my $last_five;@primes=@{primes(1000000)};foreach $primes(@primes){$hash{$primes}=$primes;}foreach $primes(@primes){@num=split//,$primes;$length=length($primes);if($length==1){next;}elsif($length==2 && exists $hash{$num[0]} && exists $hash{$num[1]}){print "$primes\n";$sum=$sum+$primes;}elsif($length==3){$first_two=join "",$num[0],$num[1];$last_two=join "",$num[1],$num[2];if(exists $hash{$num[0]} && exists $hash{$num[2]} && exists $hash{$first_two} && $hash{$last_two}){print "$primes\n";$sum=$sum+$primes;}}elsif($length==4){$first_two=join "",$num[0],$num[1];$last_two=join "",$num[2],$num[3];$first_three=join "",$num[0],$num[1],$num[2];$last_three=join "",$num[1],$num[2],$num[3];if(exists $hash{$num[0]} && exists $hash{$num[3]} && exists $hash{$first_two} && $hash{$last_two} && exists $hash{$first_three} && exists $hash{$last_three}) { print "$primes\n"; $sum=$sum+$primes; }}elsif($length==5){ $first_two=join "",$num[0],$num[1];$last_two=join "",$num[3],$num[4];$first_three=join "",$num[0],$num[1],$num[2];$last_three=join "",$num[2],$num[3],$num[4];$first_four=join "",$num[0],$num[1],$num[2],$num[3];$last_four=join "",$num[1],$num[2],$num[3],$num[4];if(exists $hash{$num[0]} && exists $hash{$num[4]} && exists $hash{$first_two} && exists $hash{$last_two}&& exists $hash{$first_three} && exists $hash{$last_three} && exists $hash{$first_four} && exists $hash{$last_four}){print "$primes\n"; $sum=$sum+$primes;}}elsif($length==6){$first_two=join "",$num[0],$num[1];$last_two=join "",$num[4],$num[5];$first_three=join "",$num[0],$num[1],$num[2];$last_three=join "",$num[3],$num[4],$num[5];$first_four=join "",$num[0],$num[1],$num[2],$num[3];$last_four=join "",$num[2],$num[3],$num[4],$num[5];$first_five=join "",$num[0],$num[1],$num[2],$num[3],$num[4];$last_five=join "",$num[1],$num[2],$num[3],$num[4],$num[5];if(exists $hash{$num[0]} && exists $hash{$num[5]} && $hash{$first_two} && $hash{$first_three} && exists $hash{$first_four} && exists $hash{$first_five} && exists $hash{$last_two} && $hash{$last_three} && exists $hash{$last_four} && $hash{$last_five}) { print "$primes\n"; $sum=$sum+$primes; }}else{next;}}print "$sum\n";
- 欧拉计划37题:找出全部11个这样从左向右和从右向左都可以裁剪的质数,shift函数的学习,从别人的答案提取精华,自己的思路和扩展的思路就是两个思路
- 回数是指从左向右读和从右向左读都是一样的数,例如 12321 , 909 。请利用 filter() 滤掉非回数
- 思路的转变-从大到小
- lib文件格式分析,以及从lib文件提取obj的思路和源码
- lib文件格式分析,以及从lib文件提取obj的思路和源码
- 从右向左的progressBar
- 从第七大道,看创业的机会和思路
- 从rand5到rand7的思路和代码验证
- 从二分法到搜索区间题解的思路扩展
- 实现从右向左拉抽屉的功能
- 从后台到webshell的一点思路
- 从建站到seo优化的整体思路
- 下拉和上拉的原理思路
- 函数参数压栈的顺序为从右向左
- printf从右向左计算,从左向右打印
- 坚持自己的思路
- 一种精确从文本中提取URL的思路及实现
- 分享一种精确从文本中提取URL的思路及实现
- H264码流分NUL包
- android开源项目学习
- POJ 2262 Goldbach's Conjecture
- 怎么创业
- OJ和OJ平台
- 欧拉计划37题:找出全部11个这样从左向右和从右向左都可以裁剪的质数,shift函数的学习,从别人的答案提取精华,自己的思路和扩展的思路就是两个思路
- Stack with Function min()
- 内嵌汇编练习-2
- sdram文章精华
- 一道题_20121221【转载】
- 分布式数据库的一致性探讨
- Android中的Broadcast Action大全
- 为程序员开一剂提高职业素养的良方。
- 普通方法指针,对象方法指针和对象方法指针的指针.