Perl — нахождение самого большого произведения палиндрома

Недавно я начал изучать Perl и написал этот код, чтобы найти наибольшее произведение палиндрома, которое можно получить, умножив 2 трехзначных числа. (вопрос здесь: 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 трехзначных числа. Так вот, этот алгоритм может быть не самым эффективным или лучшим в мире, он должен, по крайней мере, давать результат. Что это не так.

Насколько я знаю, проблема не в подпрограмме checkpal. Но блок if (&checkblock($i)) не выполняется, даже если $i является палиндромом. И я не знаю, почему. Извините, если это очевидно или что-то в этом роде.. но, пожалуйста, скажите мне, почему это не работает?


person Nirav Nikhil    schedule 06.12.2014    source источник
comment
Спасибо.. Замена for ($k=0;$k‹length($_[0]);$k++){$b = substr ($_[0], $k, 1).$b;} на $b = скалярная обратная $_[0] сработала. Я не понимаю, почему, хотя.   -  person Nirav Nikhil    schedule 06.12.2014


Ответы (1)


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)
person mpapec    schedule 06.12.2014
comment
Упс... спасибо, что указали на это. Мне просто интересно, почему я получаю 319 * 3129 в качестве ответа после замены сабвуфера checkpal на $i eq reverse $i - person Nirav Nikhil; 06.12.2014
comment
Нет, я не был. Это действительно сбивает меня с толку. Если я не использую $i eq reverse $i, я вообще не получу ответа. Я имею в виду.. функция палиндрома работает (пробовал печатать чекпал 111 ;) и работает. Но внутри цикла это не работает. - person Nirav Nikhil; 06.12.2014