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

时间:2017-08-06 08:18:10

标签: 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()
{
    $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 个答案:

答案 0 :(得分:2)

一个emirp(向下拼写的“素数”)是一个素数,其(基数10)逆转也是素数,但它不是一个回文素数。换一种说法 向后读取素数是在基数10(从右到左)向后读取的素数是不同的素数。 (这排除了作为回文的素数。)

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

  1. isPrime:感谢@Jeff Clayton测试素数的方法,有关详细信息,请点击下面的链接https://stackoverflow.com/a/24769490/4369087
  2. reverse:使用php函数[strrev()] [1],这个方法取一个字符串反转它,我们将使用这个技巧通过将它转换为字符串反转它来反转一个数字并转换回整数。
  3. backwardsPrime:这个最后一个函数的作用是从$ min值到$ max值的一系列数字进行迭代,并测试该数字是否为素数而且它的反向是一个素数,并且它不是如果所有这些条件都为真,那么回文数就会增加到结果数组。
  4. 实施

    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;
    }