Недавно я начал изучать 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 является палиндромом. И я не знаю, почему. Извините, если это очевидно или что-то в этом роде.. но, пожалуйста, скажите мне, почему это не работает?