Perl - 找到最大的回文产品

时间:2014-12-06 16:55:18

标签: perl palindrome

我最近开始学习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))块也不会被执行。我不知道为什么。对不起,如果它是显而易见的......但请告诉我它为什么不起作用?

1 个答案:

答案 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)