📜  查找下一个回文质数

📅  最后修改于: 2021-04-28 17:40:32             🧑  作者: Mango

找到最小的回文数,它也是素数,然后大于给定数N。

例子:

Input : N = 7
Output :11
11 is the smallest palindrome prime which
is greater than N.

Input : N = 112
Output : 131

一种简单的方法是从N + 1开始循环。对于每个数字,请检查它是否是回文和素数。

一个有效的解决方案基于以下观察。所有具有偶数位的回文数均为11的倍数。
我们可以证明如下:
11%11 = 0
1111%11 = 0
111111%11 = 0
11111111%11 = 0

所以:
1001%11 =(1111 – 11 * 10)%11 = 0
100001%11 =(111111 – 1111 * 10)%11 = 0
10000001%11 =(11111111 – 111111 * 10)%11 = 0

对于任何具有偶数位的回文:
abcddcba%11
=(a * 10000001 + b * 100001 * 10 + c * 1001 * 100 + d * 11 * 1000)%11
= 0

所有具有偶数位的回文数均为11的倍数。
因此,其中11是唯一的素数
如果(8 <= N <= 11)返回11
对于其他情况,我们仅考虑具有奇数位的回文。

C++
// CPP program to find next palindromic 
// prime for a given number.
#include 
#include 
using namespace std;
  
bool isPrime(int num)
{
    if (num < 2 || num % 2 == 0)
        return num == 2;
    for (int i = 3; i * i <= num; i += 2)
        if (num % i == 0)
            return false;
    return true;
}
  
int primePalindrome(int N)
{
    // if(8<=N<=11) return 11
    if (8 <= N && N <= 11)
        return 11;
  
    // generate odd length palindrome number 
    // which will cover given constraint.
    for (int x = 1; x < 100000; ++x) {
      
        string s = to_string(x), r(s.rbegin(), s.rend());
        int y = stoi(s + r.substr(1));
      
        // if y>=N and it is a prime number 
        // then return it.
        if (y >= N && isPrime(y))
            return y;
    }
  
    return -1;
}
  
// Driver code
int main()
{
    cout << primePalindrome(112);
    return 0;
}


Java
// Java program to find next palindromic
// prime for a given number.
import java.lang.*;
class Geeks {
  
static boolean isPrime(int num)
{
    if (num < 2 || num % 2 == 0)
        return num == 2;
    for (int i = 3; i * i <= num; i += 2)
        if (num % i == 0)
            return false;
    return true;
}
  
static int primePalindrome(int N)
{
    // if(8<=N<=11) return 11
    if (8 <= N && N <= 11)
        return 11;
  
    // generate odd length palindrome number 
    // which will cover given constraint.
    for (int x = 1; x < 100000; ++x) {
      
        String s = Integer.toString(x);
        StringBuffer buffer = new StringBuffer(s);
        buffer.reverse();
          
        int y = Integer.parseInt(s + 
        buffer.substring(1).toString());
      
        // if y>=N and it is a prime number 
        // then return it.
        if (y >= N && isPrime(y) == true)
            return y;
    }
  
    return -1;
}
  
// Driver code
public static void main(String args[])
{
    System.out.print(primePalindrome(112));
  
}
}


Python3
# Python3 program to find next palindromic 
# prime for a given number.
import math as mt
  
def isPrime(num):
  
    if (num < 2 or num % 2 == 0):
        return num == 2
    for i in range(3, mt.ceil(mt.sqrt(num + 1))):
        if (num % i == 0):
            return False
    return True
  
def primePalindrome(N):
  
    # if(8<=N<=11) return 11
    if (8 <= N and N <= 11):
        return 11
  
    # generate odd length palindrome number 
    # which will cover given constraint.
    for x in range(1, 100000): 
      
        s = str(x)
        d = s[::-1]
        y = int(s + d[1:])
      
        # if y>=N and it is a prime number 
        # then return it.
        if (y >= N and isPrime(y)):
            return y
      
# Driver code
print(primePalindrome(112))
  
# This code is contributed by
# Mohit kumar 29


C#
// C# program to find next palindromic 
// prime for a given number. 
using System;
using System.Text;
using System.Collections;
  
class Geeks { 
  
static bool isPrime(int num) 
{ 
    if (num < 2 || num % 2 == 0) 
        return num == 2; 
    for (int i = 3; i * i <= num; i += 2) 
        if (num % i == 0) 
            return false; 
    return true; 
} 
  
static int primePalindrome(int N) 
{ 
    // if(8<=N<=11) return 11 
    if (8 <= N && N <= 11) 
        return 11; 
  
    // generate odd length palindrome number 
    // which will cover given constraint. 
    for (int x = 1; x < 100000; ++x) { 
      
        string s = x.ToString(); 
        char[] buffer = s.ToCharArray();
        Array.Reverse(buffer);
          
        int y = Int32.Parse(s + new string(buffer).Substring(1)); 
      
        // if y>=N and it is a prime number 
        // then return it. 
        if (y >= N && isPrime(y) == true) 
            return y; 
    } 
  
    return -1; 
} 
  
// Driver code 
public static void Main() 
{ 
    Console.WriteLine(primePalindrome(112)); 
} 
} 
  
// This code is contributed by Mithun Kumar.


PHP
=N and it is a prime number 
        // then return it. 
        if ($y >= $N && isPrime($y) == true) 
            return $y; 
    } 
  
    return -1; 
} 
  
// Driver code 
print(primePalindrome(112)); 
  
// This code is contributed by mits
?>


输出:
131