我最近开始学习perl并编写了这段代码,以找到最大的回文产品,可以通过乘以2个3位数字来获得。 (问题:https://projecteuler.net/problem=4)
以下是代码:
#!/usr/bin/perl
use 5.010;
sub checkpal{
for ($k=0;$k<length($_[0]);$k++){$b = substr ($_[0], $k, 1).$b;}
if ($_[0] eq $b){1}else{0}
}
$pals = $numb1 = undef;
for ($i = 998001; $i>=10000; $i--){
if (&checkpal($i)){
for ($j = 100; $j <1000; $j++){
if ( !($i % $j) && (length $j == 3) ){$numb1 = $j; $pals = $i; last;}
}
}
if (defined $numb1){last}
}
say $numb1." ".($pals/$numb1);
我的想法非常简单。它只是通过一个从998001开始的循环(2位3位数的乘积可以得到的最大值)并检查该值是否为回文。如果它是回文,它会通过另一个循环来检查是否可以通过乘以2个三位数来获得它。现在,这个算法可能不是世界上最有效或最好的算法,至少应该给出结果。它不是。
据我所知,问题不在子程序checkpal中。但即使$ i是回文,if(&amp; checkblock($ i))块也不会被执行。我不知道为什么。对不起,如果它是显而易见的......但请告诉我它为什么不起作用?
答案 0 :(得分:0)
if ( !($i % $j) and length($i/$j)==3) { .. }
而不是
if ( !($i % $j) && (length $j == 3) )
因为你想检查$i/$j
是否有三位数,而不是$ j,无论如何都是100到999.
作为旁注,
if (checkpal($i))
可以用简单的
替换if ($i eq reverse $i)