📜  次最小的原始回文

📅  最后修改于: 2021-05-06 17:53:31             🧑  作者: Mango

给定一个正整数N ,其中1 \leq N \leq 10^{9} 。任务是找到大于或等于N的最小原始回文。

例子:

Input: 8
Output: 11

Input: 7000000000
Output: 10000500001

方法:

天真的方法是从N + 1开始循环,直到发现下一个最小的原始回文大于或等于N。

高效方法:
可以说P = R是下一个最小的大于或等于N的原始回文集
现在,因为R是回文,的R的数字的第一半可以被用于确定R将一直到两种可能性。令kR中数字的前半部分。例如。如果k = 123 ,则R = 12321R = 123321

因此,我们遍历每个k直到10 5并创建关联的回文数R ,并检查R是否为素数
同样,我们将分别处理奇数和偶数回文,并在获得结果时中断。

下面是上述方法的实现:

C++
// C++ implementation of above approach
#include 
using namespace std;
  
#define ll long long int
  
// Function to check whether 
// a number is prime
bool isPrime(ll n) 
{
    if (n < 2) return false;
      
    for (ll i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
  
// function to generate next 
// smallest prime palindrome
ll nextPrimePalindrome(ll N) 
{
for (ll k = 1; k < 1000000; k++) 
{
      
    // Check for odd-length palindromes
    string s = to_string(k);
    string z(s.begin(), s.end());
    reverse(z.begin(), z.end());
  
    // eg. s = '1234' to x = int('1234321')
    ll x = stoll(s + z.substr(1));
  
    if (x >= N and isPrime(x)) return x;
  
    // Check for even-length palindromes
    s = to_string(k);
    z = string(s.begin(), s.end());
    reverse(z.begin(), z.end());
  
    // eg. s = '1234' to x = int('12344321')
    x = stoll(s + z);
  
    if (x >= N and isPrime(x)) return x;
}
}
  
// Driver Code
int main()
{
    ll N = 7000000000;
      
    // Function call to print answer
    cout << nextPrimePalindrome(N) << endl;
      
    return 0;
}
  
// This code is contributed by
// sanjeev2552


Java
// Java implementation of above approach
class GFG
{
  
// Function to check whether 
// a number is prime
static boolean isPrime(long n) 
{
    if (n < 2) return false;
      
    for (long i = 2; i <= Math.sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
  
// reverse the String
static String reverse(String s)
{
    String s1 = "";
    for(int i = s.length() - 1; i >= 0; i--)
        s1 += s.charAt(i);
      
    return s1;
}
  
// function to generate next 
// smalongest prime palindrome
static long nextPrimePalindrome(long N) 
{
    for (long k = 1; k < 1000000l; k++) 
    {
          
        // Check for odd-length palindromes
        String s = ""+k;
        String z;
        z = reverse(s);
      
        // eg. s = '1234' to x = int('1234321')
        long x = Long.parseLong(s + z.substring(1, z.length()));
      
        if (x >= N && isPrime(x)) 
            return x;
      
        // Check for even-length palindromes
        s = ""+(k);
        z = s;
        z = reverse(z);
      
        // eg. s = '1234' to x = int('12344321')
        x = Long.parseLong(s + z);
      
        if (x >= N && isPrime(x)) return x;
    }
    return -1;
}
  
// Driver Code
public static void main(String args[])
{
    long N = 7000000000l;
      
    // Function calong to print answer
    System.out.println( nextPrimePalindrome(N) );
}
}
  
// This code is contributed by Arnab Kundu


Python3
# Python3 implementation of above approach
import math
  
# Function to check whether a number is prime
def is_prime(n):
    return n > 1 and all(n % d for d in range(2, int(math.sqrt(n)) + 1))
  
# function to generate next smallest prime palindrome
def NextprimePalindrome(N):
  
    for k in range(1, 10**6):
  
        # Check for odd-length palindromes
        s = str(k)
        x = int(s + s[-2::-1])  # eg. s = '1234' to x = int('1234321')
  
        if x >= N and is_prime(x):
            return x
  
        # Check for even-length palindromes
        s = str(k)
        x = int(s + s[-1::-1])  # eg. s = '1234' to x = int('12344321')
  
        if x >= N and is_prime(x):
            return x
  
# Driver code
N = 7000000000
  
# Function call to print answer
print(NextprimePalindrome(N))
  
# This code is written by
# Sanjit_Prasad


C#
// C# implementation of above approach
using System;
  
class GFG
{
  
// Function to check whether 
// a number is prime
static bool isPrime(long n) 
{
    if (n < 2) return false;
      
    for (long i = 2; i <= Math.Sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
  
// reverse the String
static String reverse(String s)
{
    String s1 = "";
    for(int i = s.Length - 1; i >= 0; i--)
        s1 += s[i];
      
    return s1;
}
  
// function to generate next 
// smalongest prime palindrome
static long nextPrimePalindrome(long N) 
{
    for (long k = 1; k < 1000000; k++) 
    {
          
        // Check for odd-length palindromes
        String s = ""+k;
        String z;
        z = reverse(s);
      
        // eg. s = '1234' to x = int('1234321')
        long x = long.Parse(s + z.Substring(1, z.Length - 1));
      
        if (x >= N && isPrime(x)) 
            return x;
      
        // Check for even-length palindromes
        s = ""+(k);
        z = s;
        z = reverse(z);
      
        // eg. s = '1234' to x = int('12344321')
        x = long.Parse(s + z);
      
        if (x >= N && isPrime(x)) return x;
    }
    return -1;
}
  
// Driver Code
public static void Main(String []args)
{
    long N = 7000000000;
      
    // Function calong to print answer
    Console.WriteLine( nextPrimePalindrome(N) );
}
}
  
// This code is contributed by PrinciRaj1992


输出:
10000500001

时间复杂度:O(N * sqrt(N)),其中N是上限,而sqrt(N)项来自检查候选人是否为素数。