欧拉计划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";















原创粉丝点击