Как найти обратные простые числа в диапазоне целых чисел?

Я пытаюсь решить отсталый главный вопрос.

Следующий вопрос:

Найдите все простые числа для обратного чтения между двумя положительными заданными числами (оба включительно), причем второе больше первого. Полученный массив или полученная строка будут упорядочены в соответствии с естественным порядком простых чисел.

пример

backwardsPrime(2, 100) => [13, 17, 31, 37, 71, 73, 79, 97]
backwardsPrime(9900, 10000) => [9923, 9931, 9941, 9967]

Я пытался сделать что-то вроде этого:

public function backwardPrime()
{
$start = 7000;
$stop = 7100;

$ans = [];

while($start <= $stop)
{
if($start > 10)
{
if($start !== $this->reverse($start))
{
if($this->isPrime($start) && $this->isPrime($this->reverse($start)))
{
array_push($ans, $start);
}
}
}
$start++;
}
return $ans;
}

public function reverse($num)
{
$reverse = 0;
while($num > 0)
{
$reverse = $reverse * 10;
$reverse = $reverse + $num%10;
$num = (int)($num/10);
}
return $reverse;
}

public function isPrime($num)
{
if($num == 1 || $num == 2 || $num == 3)
return true;
elseif ($num%2 == 0 || $num%3 == 0)
return false;
else
{
$i=5;
while($i<=$num/2)
{
if($num%$i===0)
{
return false;
}
$i++;
}
}
return true;
}

Я могу получить соответствующий ответ, но, делая то же самое в одной функции, я не могу получить его:

public function backwardPrimes()
{
$start = 7000;
$stop = 7100;
$ans = [];
while($start <= $stop)
{
$isStartPrime = true;
$isReversePrime = true;
if($start > 10)
{
$reverse = 0;
$num = $start;
while($num > 0)
{
$reverse = $reverse * 10;
$reverse = $reverse + $num%10;
$num = (int)($num/10);
}
if($start !== $reverse)
{
if($start%2 != 0 && $start%3 != 0)
{
$i =5;
while($i<=$start/2)
{
if($start%$i === 0)
{
$isStartPrime = false;
break;
}
$i++;
}
}
if($reverse%2 != 0 && $reverse%3 != 0)
{
$i =5;
while($i<=$reverse/2)
{
if($reverse%$i === 0)
{
$isReversePrime = false;
break;
}
$i++;
}
}
if($isStartPrime && $isReversePrime)
{
array_push($ans, $start);
}
}
}
$start++;
}
return $ans;
}

Я не знаю, где у меня ошибка, направь меня.

Благодарю.

1

Решение

Эмирп («простое», записанное в обратном направлении) — это простое число, обращение которого (основание 10) также является простым, но не является палиндромным простым. другими словами
Простое чтение в обратном направлении — это простые числа, которые при обратном чтении в основании 10 (справа налево) представляют собой другое простое число. (Это исключает простые числа, которые являются палиндромами.)

попробуйте это короткое решение, в котором я использую две вспомогательные функции reverse а также isPrime :

  1. isPrime: Спасибо @Jeff Clayton за его метод проверки простых чисел, для получения дополнительной информации перейдите по ссылке ниже https://stackoverflow.com/a/24769490/4369087
  2. reverse: который использует функцию php [strrev ()] [1], этот метод принимает строку в обратном порядке, мы будем использовать этот трюк, чтобы обратить число, преобразовав его в строку, обратить его и преобразовать обратно в целое число.
  3. backwardsPrime: эта функция последней функции выполняет итерацию по диапазону чисел от значения $ min до значения $ max и проверяет, является ли число, если простое число и его обратное, также простое число и не является числом палиндрома, если все эти условия true тогда мы добавляем в массив результатов.

реализация

function isPrime($number)
{
return !preg_match('/^1?$|^(11+?)\1+$/x', str_repeat('1', $number));
}

function reverse($n)
{
return (int) strrev((string) $n);
}

function backwardsPrime($min, $max)
{
$result = [];

foreach(range($min, $max) as $number) {
$reverse = reverse($number);
if($reverse !== $number  && isPrime($number) && isPrime($reverse)) {
$result[] = $number;
}
}

return $result;
}

echo "<pre>";
print_r(backwardsPrime(2, 100));
print_r(backwardsPrime(9900, 10000));

выход :

Array
(
[0] => 13
[1] => 17
[2] => 31
[3] => 37
[4] => 71
[5] => 73
[6] => 79
[7] => 97
)Array
(
[0] => 9923
[1] => 9931
[2] => 9941
[3] => 9967
)

Вы даже можете оптимизировать функцию backwardsPrime следующим образом:

function backwardsPrime($min, $max)
{
$result = [];

foreach(range($min, $max) as $number) {
$reverse = reverse($number);
if($reverse !== $number && !in_array($number, $result) && isPrime($number) && isPrime($reverse)) {
$result[] = $number;
}
}

return $result;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]