Php 如何在整数范围内找到反向素数?

Php 如何在整数范围内找到反向素数?,php,function,range,primes,palindrome,Php,Function,Range,Primes,Palindrome,我想解决一个向后的质点问题 问题如下: 查找两个正数(包括两个)之间的所有反向读取素数,第二个大于第一个。结果数组或结果字符串将按照素数的自然顺序排序 范例 backwardsPrime(2, 100) => [13, 17, 31, 37, 71, 73, 79, 97] backwardsPrime(9900, 10000) => [9923, 9931, 9941, 9967] 我试过这样做: public function backwardPrime() { $s

我想解决一个向后的质点问题

问题如下:

查找两个正数(包括两个)之间的所有反向读取素数,第二个大于第一个。结果数组或结果字符串将按照素数的自然顺序排序

范例

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;
}
公共函数backwardPrime()
{
$start=7000;
$stop=7100;
$ans=[];
而($start 10)
{
如果($start!==$this->reverse($start))
{
如果($this->isPrime($start)&&&$this->isPrime($this->reverse($start)))
{
阵列推送($ans,$start);
}
}
}
$start++;
}
返回$ans;
}
公共函数反向($num)
{
$reverse=0;
而($num>0)
{
$reverse=$reverse*10;
$reverse=$reverse+num%10;
$num=(int)($num/10);
}
返回$reverse;
}
公共功能iPrime($num)
{
如果($num==1 | |$num==2 | |$num==3)
返回true;
elseif($num%2==0 | |$num%3==0)
返回false;
其他的
{
$i=5;
而(i)(0元)
{
$reverse=$reverse*10;
$reverse=$reverse+num%10;
$num=(int)($num/10);
}
如果($start!==$reverse)
{
如果($start%2!=0&&$start%3!=0)
{
$i=5;
而($iemirp(“prime”拼写向后)是一个质数,其(基数10)的倒转也是质数,但它不是回文质数。换句话说
向后读取素数是指在基数10中向后读取时(从右到左)是不同素数的素数。(这排除了回文素数。)

试试这个简短的解决方案,其中我使用了两个辅助函数
reverse
isPrime

  • isPrime
    :感谢@Jeff Clayton测试素数的方法,有关更多信息,请单击下面的链接
  • reverse
    :如果使用php函数[strrev()][1],此方法将字符串转换为反转它,我们将使用此技巧通过将数字转换为字符串反转并转换回整数来反转数字
  • backwardsPrime
    :最后一个函数的任务是在从$min value到$max value的一系列数字上进行初始化,并测试该数字是否为素数,它的倒数是否为素数,它是否为回文数如果所有这些条件都为真,则我们将其添加到结果数组中
  • 实施 您甚至可以像这样优化BackardSprime函数:


    我用了另一种方法来解决这个问题,希望能对你有所帮助。对于你的功能,我不知道你是如何得到的。
    $start=7000;$stop=7100;
    有点难理解guess@yoeunes我只是使用虚拟数据进行计算。谢谢你,mickmackusa先生,我稍后会解释details@yoeunes谢谢你的回答,你的优化代码没有给出正确的答案。我是说第二个代码。是的,我只是对最后的数组进行了排序。我尝试了虚拟数据
    [99001000]
    ,我得到了
    [9923329993113999941149999677699]的输出
    具有两个或更多数字的素数只能以1、3、7或9结尾。因此,EMIRP只能以这些数字开头。
    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;
    }
    
    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
    )
    
    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;
    }