N’th palindrome of K digits

27 Apr, 2021
Given two integers n and k, Find the lexicographical nth palindrome of k digits.Examples:  
Input  : n = 5, k = 4
Output : 1441
Explanation:
4 digit lexicographical palindromes are:
1001, 1111, 1221, 1331, 1441
5th palindrome = 1441

Input  :  n = 4, k = 6
Output : 103301
 
 
Naive Approach
A brute force is to run a loop from the smallest kth digit number and check for every number whether it is palindrome or not. If it is a palindrome number then decrements the value of k. Therefore the loop runs until k becomes exhausted.  
C++
Java
Python3
C#
PHP
Javascript
// A naive approach of C++ program of finding nth// palindrome of k digit#include<bits/stdc++.h>using namespace std; // Utility function to reverse the number nint reverseNum(int n){    int rem, rev=0;    while (n)    {        rem = n % 10;        rev = rev * 10 + rem;        n /= 10;    }    return rev;} // Boolean Function to check for palindromic// numberbool isPalindrom(int num){    return num == reverseNum(num);} // Function for finding nth palindrome of k digitsint nthPalindrome(int n,int k){    // Get the smallest k digit number    int num = (int)pow(10, k-1);     while (true)    {        // check the number is palindrom or not        if (isPalindrom(num))            --n;         // if n'th palindrome found break the loop        if (!n)            break;         // Increment number for checking next palindrome        ++num;    }     return num;} // Driver codeint main(){    int n = 6, k = 5;    printf("%dth palindrome of %d digit = %d\n",           n, k, nthPalindrome(n, k));     n = 10, k = 6;    printf("%dth palindrome of %d digit = %d",           n, k, nthPalindrome(n, k));    return 0;}
// A naive approach of Java program of finding nth// palindrome of k digitimport java.util.*; class GFG{// Utility function to reverse the number nstatic int reverseNum(int n){    int rem, rev = 0;    while (n > 0)    {        rem = n % 10;        rev = rev * 10 + rem;        n /= 10;    }    return rev;} // Boolean Function to check for palindromic// numberstatic boolean isPalindrom(int num){    return num == reverseNum(num);} // Function for finding nth palindrome of k digitsstatic int nthPalindrome(int n, int k){    // Get the smallest k digit number    int num = (int)Math.pow(10, k-1);     while (true)    {        // check the number is palindrom or not        if (isPalindrom(num))            --n;         // if n'th palindrome found break the loop        if (n == 0)            break;         // Increment number for checking next palindrome        ++num;    }     return num;} // Driver codepublic static void main(String[] args){    int n = 6, k = 5;    System.out.println(n + "th palindrome of " + k + " digit = " + nthPalindrome(n, k));     n = 10; k = 6;    System.out.println(n + "th palindrome of " + k + " digit = " + nthPalindrome(n, k));}} // This code is contributed by mits
# A naive approach of Python3 program# of finding nth palindrome of k digitimport math;# Utility function to# reverse the number ndef reverseNum(n):    rev = 0;    while (n):        rem = n % 10;        rev = (rev * 10) + rem;        n = int(n / 10);      return rev; # Boolean Function to check for# palindromic numberdef isPalindrom(num):    return num == reverseNum(num); # Function for finding nth# palindrome of k digitsdef nthPalindrome(n, k):    # Get the smallest k digit number    num = math.pow(10, k - 1);     while (True):        # check the number is        # palindrom or not        if (isPalindrom(num)):            n-=1;         # if n'th palindrome found        # break the loop        if (not n):            break;         # Increment number for checking        # next palindrome        num+=1;     return int(num); # Driver coden = 6;k = 5;print(n,"th palindrome of",k,"digit =",nthPalindrome(n, k)); n = 10;k = 6;print(n,"th palindrome of",k,"digit =",nthPalindrome(n, k)); # This code is contributed by mits
// A naive approach of C# program of finding nth// palindrome of k digitusing System; class GFG{// Utility function to reverse the number nstatic int reverseNum(int n){    int rem, rev = 0;    while (n > 0)    {        rem = n % 10;        rev = rev * 10 + rem;        n /= 10;    }    return rev;} // Boolean Function to check for palindromic// numberstatic bool isPalindrom(int num){    return num == reverseNum(num);} // Function for finding nth palindrome of k digitsstatic int nthPalindrome(int n, int k){    // Get the smallest k digit number    int num = (int)Math.Pow(10, k-1);     while (true)    {        // check the number is palindrom or not        if (isPalindrom(num))            --n;         // if n'th palindrome found break the loop        if (n == 0)            break;         // Increment number for checking next palindrome        ++num;    }     return num;} // Driver codepublic static void Main(){    int n = 6, k = 5;    Console.WriteLine(n + "th palindrome of " + k + " digit = " + nthPalindrome(n, k));     n = 10; k = 6;    Console.WriteLine(n + "th palindrome of " + k + " digit = " + nthPalindrome(n, k));}} // This code is contributed// by Akanksha Rai
<?php// A naive approach of PHP program// of finding nth palindrome of k digit // Utility function to// reverse the number nfunction reverseNum($n){    $rem;    $rev = 0;    while ($n)    {        $rem = $n % 10;        $rev = ($rev * 10) + $rem;        $n = (int)($n / 10);    }    return $rev;} // Boolean Function to check for// palindromic numberfunction isPalindrom($num){    return $num == reverseNum($num);} // Function for finding nth// palindrome of k digitsfunction nthPalindrome($n, $k){    // Get the smallest k digit number    $num = pow(10, $k - 1);     while (true)    {        // check the number is        // palindrom or not        if (isPalindrom($num))            --$n;         // if n'th palindrome found        // break the loop        if (!$n)            break;         // Increment number for checking        // next palindrome        ++$num;    }     return $num;} // Driver code$n = 6;$k = 5;echo $n, "th palindrome of ", $k, " digit = ",                  nthPalindrome($n, $k), "\n"; $n = 10;$k = 6;echo $n,"th palindrome of ", $k, " digit = ",                 nthPalindrome($n, $k), "\n"; // This code is contributed by ajit?>
<script>     // A naive approach of Javascript    // program of finding nth    // palindrome of k digit         // Utility function to    // reverse the number n    function reverseNum(n)    {        let rem, rev = 0;        while (n > 0)        {            rem = n % 10;            rev = rev * 10 + rem;            n = parseInt(n / 10);        }        return rev;    }     // Boolean Function to    // check for palindromic    // number    function isPalindrom(num)    {        return num == reverseNum(num);    }     // Function for finding nth    // palindrome of k digits    function nthPalindrome(n, k)    {        // Get the smallest k digit number        let num = Math.pow(10, k-1);         while (true)        {            // check the number is            // palindrom or not            if (isPalindrom(num))                --n;             // if n'th palindrome found            // break the loop            if (n == 0)                break;             // Increment number for checking            // next palindrome            ++num;        }         return num;    }         let n = 6, k = 5;    document.write(n + "th palindrome of " + k +    " digit = " + nthPalindrome(n, k) + "</br>");       n = 10; k = 6;    document.write(n + "th palindrome of " + k +    " digit = " + nthPalindrome(n, k)); </script>
Output: 
6th palindrome of 5 digit = 10501
10th palindrome of 6 digit = 109901
Time complexity: O(10k) Auxiliary space: O(1) 
Efficient approach
An efficient method is to look for a pattern. According to the property of palindrome first, half digits are the same as the rest half digits in reverse order. Therefore, we only need to look for the first half digits as the rest of them can easily be generated. Let’s take k = 8, the smallest palindrome always starts from 1 as the leading digit and goes like that for the first 4 digits of the number.  
First half values for k = 8
1st: 1000
2nd: 1001
3rd: 1002
...
...
100th: 1099

So we can easily write the above sequence for nth
palindrome as: (n-1) + 1000
For k digit number, we can generalize above formula as:

If k is odd
=> num = (n-1) + 10k/2
else 
=> num = (n-1) + 10k/2 - 1 

Now rest half digits can be expanded by just 
printing the value of num in reverse order. 
But before this if k is odd then we have to truncate 
the last digit of a value num 
Illustration: n = 6 k = 5  
Determine the number of first half digits = floor(5/2) = 2Use formula: num = (6-1) + 102 = 105Expand the rest half digits by reversing the value of num. Final answer will be 10501
Determine the number of first half digits = floor(5/2) = 2
Use formula: num = (6-1) + 102 = 105
Expand the rest half digits by reversing the value of num. Final answer will be 10501
Below is the implementation of the above steps  
C++
Java
Python3
C#
PHP
Javascript
// C++ program of finding nth palindrome// of k digit#include<bits/stdc++.h>using namespace std; void nthPalindrome(int n, int k){    // Determine the first half digits    int temp = (k & 1) ? (k / 2) : (k/2 - 1);    int palindrome = (int)pow(10, temp);    palindrome += n - 1;     // Print the first half digits of palindrome    printf("%d", palindrome);     // If k is odd, truncate the last digit    if (k & 1)        palindrome /= 10;     // print the last half digits of palindrome    while (palindrome)    {        printf("%d", palindrome % 10);        palindrome /= 10;    }    printf("\n");} // Driver codeint main(){    int n = 6, k = 5;    printf("%dth palindrome of %d digit = ",n ,k);    nthPalindrome(n ,k);     n = 10, k = 6;    printf("%dth palindrome of %d digit = ",n ,k);    nthPalindrome(n, k);    return 0;}
// Java program of finding nth palindrome// of k digit  class GFG{static void nthPalindrome(int n, int k){    // Determine the first half digits    int temp = (k & 1)!=0 ? (k / 2) : (k/2 - 1);    int palindrome = (int)Math.pow(10, temp);    palindrome += n - 1;     // Print the first half digits of palindrome    System.out.print(palindrome);     // If k is odd, truncate the last digit    if ((k & 1)>0)        palindrome /= 10;     // print the last half digits of palindrome    while (palindrome>0)    {        System.out.print(palindrome % 10);        palindrome /= 10;    }    System.out.println("");} // Driver codepublic static void main(String[] args){    int n = 6, k = 5;    System.out.print(n+"th palindrome of "+k+" digit = ");    nthPalindrome(n ,k);     n = 10;    k = 6;    System.out.print(n+"th palindrome of "+k+" digit = ");    nthPalindrome(n, k); }}// This code is contributed by mits
# Python3 program of finding nth palindrome# of k digit def nthPalindrome(n, k):     # Determine the first half digits    if(k & 1):        temp = k // 2    else:        temp = k // 2 - 1     palindrome = 10**temp    palindrome = palindrome + n - 1     # Print the first half digits of palindrome    print(palindrome, end="")     # If k is odd, truncate the last digit    if(k & 1):        palindrome = palindrome // 10     # print the last half digits of palindrome    while(palindrome):        print(palindrome % 10, end="")        palindrome = palindrome // 10 # Driver codeif __name__=='__main__':    n = 6    k = 5    print(n, "th palindrome of", k, " digit = ", end=" ")    nthPalindrome(n, k)    print()    n = 10    k = 6    print(n, "th palindrome of", k, "digit = ",end=" ")    nthPalindrome(n, k) # This code is contributed by# Sanjit_Prasad
// C# program of finding nth palindrome// of k digitusing System; class GFG{static void nthPalindrome(int n, int k){    // Determine the first half digits    int temp = (k & 1) != 0 ? (k / 2) : (k / 2 - 1);    int palindrome = (int)Math.Pow(10, temp);    palindrome += n - 1;     // Print the first half digits    // of palindrome    Console.Write(palindrome);     // If k is odd, truncate the last digit    if ((k & 1) > 0)        palindrome /= 10;     // print the last half digits    // of palindrome    while (palindrome>0)    {        Console.Write(palindrome % 10);        palindrome /= 10;    }    Console.WriteLine("");} // Driver codestatic public void Main (){    int n = 6, k = 5;    Console.Write(n+"th palindrome of " + k +                                " digit = ");    nthPalindrome(n, k);         n = 10;    k = 6;    Console.Write(n+"th palindrome of " + k +                                " digit = ");    nthPalindrome(n, k);}} // This code is contributed by ajit
<?php// PHP program of finding nth palindrome// of k digit function nthPalindrome($n, $k){    // Determine the first half digits    $temp = ($k & 1) ?            (int)($k / 2) : (int)($k / 2 - 1);    $palindrome = (int)pow(10, $temp);    $palindrome += $n - 1;     // Print the first half digits of palindrome    print($palindrome);     // If k is odd, truncate the last digit    if ($k & 1)        $palindrome = (int)($palindrome / 10);     // print the last half digits of palindrome    while ($palindrome > 0)    {        print($palindrome % 10);        $palindrome = (int)($palindrome / 10);    }    print("\n");} // Driver code$n = 6;$k = 5;print($n."th palindrome of $k digit = ");nthPalindrome($n, $k); $n = 10;$k = 6;print($n."th palindrome of $k digit = ");nthPalindrome($n, $k); // This code is contributed by mits?>
<script>    // Javascript program of finding nth palindrome of k digit         function nthPalindrome(n, k)    {        // Determine the first half digits        let temp = (k & 1) != 0 ? parseInt(k / 2, 10) : (parseInt(k / 2, 10) - 1);        let palindrome = parseInt(Math.pow(10, temp), 10);        palindrome += n - 1;         // Print the first half digits        // of palindrome        document.write(palindrome);         // If k is odd, truncate the last digit        if ((k & 1) > 0)            palindrome = parseInt(palindrome / 10, 10);         // print the last half digits        // of palindrome        while (palindrome>0)        {            document.write(palindrome % 10);            palindrome = parseInt(palindrome / 10, 10);        }        document.write("" + "</br>");    }         let n = 6, k = 5;    document.write(n+"th palindrome of " + k + " digit = ");    nthPalindrome(n, k);          n = 10;    k = 6;    document.write(n+"th palindrome of " + k + " digit = ");    nthPalindrome(n, k); </script>
Output: 
6th palindrome of 5 digit = 10501
10th palindrome of 6 digit = 109901
Time complexity: O(k) Auxiliary space: O(1)Reference: http://stackoverflow.com/questions/11925840/how-to-calculate-nth-n-digit-palindrome-efficientlyThis article is contributed by Shubham Bansal. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
Sanjit_Prasad
Mithun Kumar
jit_t
Akanksha_Rai
divyeshrabadiya07
mukesh07
palindrome
Mathematical
Mathematical
palindrome
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Set in C++ Standard Template Library (STL)
Program for Fibonacci numbers
C++ Data Types
Write a program to print all permutations of a given string
Merge two sorted arrays
Coin Change | DP-7
Operators in C / C++
Prime Numbers
Program to find GCD or HCF of two numbers
Minimum number of jumps to reach end