给定一个数字,找到下一个最小的回文

给定一个数字,找到比这个数字大的下一个最小回文。例如,如果输入数字为“2 3 5 4 5”,则输出应为“2 3 6 3 2”。如果输入数字为“9 9 9”,则输出应为“1 0 0 1”。 假设输入是一个数组。数组中的每个条目代表输入数字中的一个数字。让数组为’num[],数组大小为’n’

null

可能有三种不同类型的输入需要分别处理。 1) 输入的数字是回文的,全部为9。例如“9”。输出应为“1 0 1” 2) 输入的数字不是回文。例如“1234”。输出应为“1 3 1” 3) 输入的数字是回文的,并不是所有的9。例如“1 2 1”。输出应为“1 3 1”。

输入类型1的解决方案很简单。输出包含n+1位,其中角位为1,角位之间的所有数字均为0。 现在让我们先谈谈输入类型2和3。如何将给定的数字转换为更大的回文?为了理解解决方案,让我们首先定义以下两个术语:

左侧: 给定数字的左半部分。“123456”的左边是“1233”,而“123445”的左边是“1232”

右侧: 给定数字的右半部分。“123456”的右边是“456”,而“123445”的右边是“45”

要转换为回文,我们可以取其左侧的镜像,也可以取其右侧的镜像。然而,如果我们照右边的镜子,那么这样形成的回文不一定是下一个更大的回文。所以,我们必须把左边的镜子复制到右边。但有些案件必须以不同的方式处理。请参见以下步骤。 我们将从两个指数i和j开始。i指向两个中间元素(或者在n为奇数的情况下指向中间元素周围的两个元素)。我们一个接一个地把i和j分开。

第一步。 首先,忽略左侧与右侧相应部分相同的部分。例如,如果数字是“8 3” 4 2 2 4 6.9〃,我们忽略了中间的四个元素。我现在指向元素3,j现在指向元素6。

第二步。 在步骤1之后,出现以下情况: 案例1: i&j指数跨越国界。 当输入的数字是回文时,就会出现这种情况。在这种情况下,我们只需在中间数字上加1(或在n为偶数的情况下加1),将进位传播到左侧的MSB位,同时将左侧的镜像复制到右侧。 例如,如果给定的数字是“1 2 9 2 1”,我们将9增加到10并传播进位。所以这个数字变成了“1 3 0 3 1”

案例2: 在左侧和右侧之间有不相同的数字。所以,我们只需将左侧镜像到右侧,尽量减少形成的数量,以保证回文的最小值。 在这种情况下,可能会有 两个子案例 .

2.1) 将左侧复制到右侧就足够了,我们不需要增加任何数字,结果只是左侧的镜像。下面是这个子案例的一些例子。 “7”的下一个回文 8. “3 3 2”是“7 8 3 8 7” “12”的下一个回文 5. “3 2 2”是“1 2 5 2 1” “14”的下一个回文 5. 8 7 6 7 8 3 2”是“1 4 5 8 7 7 8 5 4 1” 我们如何检查这个子案例?我们只需要检查第1步中被忽略部分后面的数字。上述示例中突出显示了该数字。如果这个数字大于右边数字中相应的数字,那么将左边复制到右边就足够了,我们不需要做任何其他事情。

2.2) 将左侧复制到右侧是不够的。当上面定义的左侧数字较小时,就会发生这种情况。下面是一些例子。 “7”的下一个回文 1. “3 3 2”是“7 1 4 1 7” “12”的下一个回文 3. “4 6 2 8”是“1 2 3 5 3 2 1” “9 4”的下一个回文 1. 8 7 9 7 8 3 2”是“9 4 1 8 0 8 1 4 9” 我们像案例1一样处理这个子案例。我们只需在中间数字(或n为偶数时的数字)上加1,将进位传播到左侧的MSB位,同时将左侧的镜像复制到右侧。

方法1: 寻找次最小回文数的基本方法。

C++

#include <bits/stdc++.h>
using namespace std;
// Function to check whether number is palindrome or not
int isPalindrome( int num)
{
// Declaring variables
int n, k, rev = 0;
// storing num in n so that we can compare it later
n = num;
// while num is not 0 we find its reverse and store in
// rev
while (num != 0) {
k = num % 10;
rev = (rev * 10) + k;
num = num / 10;
}
// check if num and its reverse are same
if (n == rev) {
return 1;
}
else {
return 0;
}
}
int main()
{
// Take any number to find its next palindrome number
int num = 9687;
// If number is not Palindrome we go to the next number
// using while loop
while (!isPalindrome(num)) {
num = num + 1;
}
// now we get the next Palindrome so let's print it
cout << "Next Palindrome :" ;
cout << num;
return 0;
}
// Contribute by :- Tejas Bhavsar


JAVA

import java.io.*;
class GFG
{
// Function to check whether number is palindrome or not
static int isPalindrome( int num)
{
// Declaring variables
int n, k, rev = 0 ;
// storing num in n so that we can compare it later
n = num;
// while num is not 0 we find its reverse and store
// in rev
while (num != 0 ) {
k = num % 10 ;
rev = (rev * 10 ) + k;
num = num / 10 ;
}
// check if num and its reverse are same
if (n == rev) {
return 1 ;
}
else {
return 0 ;
}
}
// Driver code
public static void main(String[] args)
{
// Take any number to find its next palindrome
// number
int num = 9687 ;
// If number is not Palindrome we go to the next
// number using while loop
while (isPalindrome(num) == 0 ) {
num = num + 1 ;
}
// now we get the next Palindrome so let's print it
System.out.print( "Next Palindrome :" );
System.out.print(num);
}
}
// This code is contributed by subhammahato348.


Python3

# Program to print find next palindrome
# number greater than given number.
# function to check a number is
# palindrome or not
def isPalindrome(num):
# Declaring variables
# storing num in n so that we can compare it later
n = num
rev = 0
# while num is not 0 we find its reverse and store
# in rev
while (num > 0 ):
k = num % 10
rev = (rev * 10 ) + k
num = num / / 10
# check if num and its reverse are same
if (n = = rev):
return True
else :
return False
# input number
num = 9687
# start check from next num;
num = num + 1
# Loop checks all numbers from given no.
# (num + 1) to next palindrome no.
while ( True ):
if (isPalindrome(num)):
break
num = num + 1
# printing the next palindrome
print ( "Next Palindrome :" )
print (num)
# This code is contributed by sidharthsingh7898.


C#

using System;
class GFG {
// Function to check whether number is palindrome or not
static int isPalindrome( int num)
{
// Declaring variables
int n, k, rev = 0;
// storing num in n so that we can compare it later
n = num;
// while num is not 0 we find its reverse and store
// in rev
while (num != 0) {
k = num % 10;
rev = (rev * 10) + k;
num = num / 10;
}
// check if num and its reverse are same
if (n == rev) {
return 1;
}
else {
return 0;
}
}
// Driver code
public static void Main()
{
// Take any number to find its next palindrome
// number
int num = 9687;
// If number is not Palindrome we go to the next
// number using while loop
while (isPalindrome(num) == 0) {
num = num + 1;
}
// now we get the next Palindrome so let's print it
Console.Write( "Next Palindrome :" );
Console.Write(num);
}
}
// This code is contributed by subhammahato348.


Javascript

<script>
// Javascript program for the above approach
// Function to check whether number is palindrome or not
function isPalindrome(num)
{
// Declaring variables
let n, k, rev = 0;
// storing num in n so that we can compare it later
n = num;
// while num is not 0 we find its reverse and store
// in rev
while (num != 0) {
k = num % 10;
rev = (rev * 10) + k;
num = Math.floor(num / 10);
}
// check if num and its reverse are same
if (n == rev) {
return 1;
}
else {
return 0;
}
}
// Driver Code
// Take any number to find its next palindrome
// number
let num = 9687;
// If number is not Palindrome we go to the next
// number using while loop
while (isPalindrome(num) == 0) {
num = num + 1;
}
// now we get the next Palindrome so let's print it
document.write( "Next Palindrome :" );
document.write(num);
// This code is contributed by splevel62.
</script>


输出

Next Palindrome :9779

时间复杂性: O(num*|num |)

C++

#include <iostream>
using namespace std;
// Utility that prints out an array on a line
void printArray( int arr[], int n)
{
int i;
for (i = 0; i < n; i++)
printf ( "%d " , arr[i]);
printf ( "" );
}
// A utility function to check if num has all 9s
int AreAll9s( int * num, int n )
{
int i;
for (i = 0; i < n; ++i)
if (num[i] != 9)
return 0;
return 1;
}
// Returns next palindrome of a given number num[].
// This function is for input type 2 and 3
void generateNextPalindromeUtil ( int num[], int n )
{
// Find the index of mid digit
int mid = n / 2;
// A bool variable to check if copy of left
// side to right is sufficient or not
bool leftsmaller = false ;
// End of left side is always 'mid -1'
int i = mid - 1;
// Beginning of right side depends
// if n is odd or even
int j = (n % 2) ? mid + 1 : mid;
// Initially, ignore the middle same digits
while (i >= 0 && num[i] == num[j])
i--, j++;
// Find if the middle digit(s) need to be
// incremented or not (or copying left
// side is not sufficient)
if (i < 0 || num[i] < num[j])
leftsmaller = true ;
// Copy the mirror of left to tight
while (i >= 0)
{
num[j] = num[i];
j++;
i--;
}
// Handle the case where middle digit(s) must
// be incremented. This part of code is for
// CASE 1 and CASE 2.2
if (leftsmaller == true )
{
int carry = 1;
i = mid - 1;
// If there are odd digits, then increment
// the middle digit and store the carry
if (n % 2 == 1)
{
num[mid] += carry;
carry = num[mid] / 10;
num[mid] %= 10;
j = mid + 1;
}
else
j = mid;
// Add 1 to the rightmost digit of the
// left side, propagate the carry towards
// MSB digit and simultaneously copying
// mirror of the left side to the right side.
while (i >= 0)
{
num[i] += carry;
carry = num[i] / 10;
num[i] %= 10;
// Copy mirror to right
num[j++] = num[i--];
}
}
}
// The function that prints next palindrome
// of a given number num[] with n digits.
void generateNextPalindrome( int num[], int n)
{
int i;
printf ( "Next palindrome is:" );
// Input type 1: All the digits are 9, simply o/p 1
// followed by n-1 0's followed by 1.
if (AreAll9s(num, n))
{
printf ( "1 " );
for (i = 1; i < n; i++)
printf ( "0 " );
printf ( "1" );
}
// Input type 2 and 3
else
{
generateNextPalindromeUtil(num, n);
// print the result
printArray (num, n);
}
}
// Driver code
int main()
{
int num[] = { 9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2 };
int n = sizeof (num) / sizeof (num[0]);
generateNextPalindrome(num, n);
return 0;
}
// This code is contributed by rohan07


C

#include <stdio.h>
/ / A utility function to print an array
void printArray ( int arr[], int n);
/ / A utility function to check if num has all 9s
int AreAll9s ( int num[], int n );
/ / Returns next palindrome of a given number num[].
/ / This function is for input type 2 and 3
void generateNextPalindromeUtil ( int num[], int n )
{
/ / find the index of mid digit
int mid = n / 2 ;
/ / A bool variable to check if copy of left side to right is sufficient or not
bool leftsmaller = false;
/ / end of left side is always 'mid -1'
int i = mid - 1 ;
/ / Beginning of right side depends if n is odd or even
int j = (n % 2 )? mid + 1 : mid;
/ / Initially, ignore the middle same digits
while (i > = 0 && num[i] = = num[j])
i - - ,j + + ;
/ / Find if the middle digit(s) need to be incremented or not ( or copying left
/ / side is not sufficient)
if ( i < 0 || num[i] < num[j])
leftsmaller = true;
/ / Copy the mirror of left to tight
while (i > = 0 )
{
num[j] = num[i];
j + + ;
i - - ;
}
/ / Handle the case where middle digit(s) must be incremented.
/ / This part of code is for CASE 1 and CASE 2.2
if (leftsmaller = = true)
{
int carry = 1 ;
i = mid - 1 ;
/ / If there are odd digits, then increment
/ / the middle digit and store the carry
if (n % 2 = = 1 )
{
num[mid] + = carry;
carry = num[mid] / 10 ;
num[mid] % = 10 ;
j = mid + 1 ;
}
else
j = mid;
/ / Add 1 to the rightmost digit of the left side, propagate the carry
/ / towards MSB digit and simultaneously copying mirror of the left side
/ / to the right side.
while (i > = 0 )
{
num[i] + = carry;
carry = num[i] / 10 ;
num[i] % = 10 ;
num[j + + ] = num[i - - ]; / / copy mirror to right
}
}
}
/ / The function that prints next palindrome of a given number num[]
/ / with n digits.
void generateNextPalindrome( int num[], int n )
{
int i;
printf( "Next palindrome is:" );
/ / Input type 1 : All the digits are 9 , simply o / p 1
/ / followed by n - 1 0 's followed by 1.
if ( AreAll9s( num, n ) )
{
printf( "1 " );
for ( i = 1 ; i < n; i + + )
printf( "0 " );
printf( "1" );
}
/ / Input type 2 and 3
else
{
generateNextPalindromeUtil ( num, n );
/ / print the result
printArray (num, n);
}
}
/ / A utility function to check if num has all 9s
int AreAll9s( int * num, int n )
{
int i;
for ( i = 0 ; i < n; + + i )
if ( num[i] ! = 9 )
return 0 ;
return 1 ;
}
/ * Utility that prints out an array on a line * /
void printArray( int arr[], int n)
{
int i;
for (i = 0 ; i < n; i + + )
printf( "%d " , arr[i]);
printf( "" );
}
/ / Driver Program to test above function
int main()
{
int num[] = { 9 , 4 , 1 , 8 , 7 , 9 , 7 , 8 , 3 , 2 , 2 };
int n = sizeof (num) / sizeof(num[ 0 ]);
generateNextPalindrome( num, n );
return 0 ;
}


JAVA

// Java program to find next smallest
// palindrome
public class nextplaindrome
{
// Returns next palindrome of a given
// number num[]. This function is for
// input type 2 and 3
static void generateNextPalindromeUtil( int num[], int n)
{
int mid = n / 2 ;
// end of left side is always 'mid -1'
int i = mid - 1 ;
// Beginning of right side depends
// if n is odd or even
int j = (n % 2 == 0 ) ? mid : mid + 1 ;
// A bool variable to check if copy of left
// side to right
// is sufficient or not
boolean leftsmaller = false ;
// Initially, ignore the middle same digits
while (i >= 0 && num[i] == num[j])
{
i--;
j++;
}
// Find if the middle digit(s) need to
// be incremented or not (or copying left
// side is not sufficient)
if (i < 0 || num[i] < num[j])
{
leftsmaller = true ;
}
// Copy the mirror of left to tight
while (i >= 0 )
{
num[j++] = num[i--];
}
// Handle the case where middle digit(s)
// must be incremented. This part of code
// is for CASE 1 and CASE 2.2
if (leftsmaller)
{
int carry = 1 ;
// If there are odd digits, then increment
// the middle digit and store the carry
if (n % 2 == 1 ) {
num[mid] += 1 ;
carry = num[mid] / 10 ;
num[mid] %= 10 ;
}
i = mid - 1 ;
j = (n % 2 == 0 ? mid : mid + 1 );
// Add 1 to the rightmost digit of the left
// side, propagate the carry towards MSB digit
// and simultaneously copying mirror of the
// left side to the right side.
//when carry is zero no need to loop through till i>=0
while (i >= 0 && carry> 0 )
{
num[i] = num[i] + carry;
carry = num[i] / 10 ;
num[i] %= 10 ;
num[j] = num[i]; // copy mirror to right
i--;
j++;
}
}
}
// The function that prints next palindrome
// of a given number num[] with n digits.
static void generateNextPalindrome( int num[], int n)
{
System.out.println( "Next Palindrome is:" );
// Input type 1: All the digits are 9,
// simply o/p 1 followed by n-1 0's
// followed by 1.
if (isAll9(num, n)) {
System.out.print( "1" );
for ( int i = 0 ; i < n - 1 ; i++)
System.out.print( "0" );
System.out.println( "1" );
}
// Input type 2 and 3
else {
generateNextPalindromeUtil(num, n);
printarray(num);
}
}
// A utility function to check if num has all 9s
static boolean isAll9( int num[], int n) {
for ( int i = 0 ; i < n; i++)
if (num[i] != 9 )
return false ;
return true ;
}
/* Utility that prints out an array on a line */
static void printarray( int num[]) {
for ( int i = 0 ; i < num.length; i++)
System.out.print(num[i]);
System.out.println();
}
public static void main(String[] args)
{
int num[] = { 9 , 4 , 1 , 8 , 7 , 9 , 7 , 8 , 3 , 2 , 2 };
generateNextPalindrome(num, num.length);
}
}


Python3

# Returns next palindrome of a given number num[].
# This function is for input type 2 and 3
def generateNextPalindromeUtil (num, n) :
# find the index of mid digit
mid = int (n / 2 )
# A bool variable to check if copy of left
# side to right is sufficient or not
leftsmaller = False
# end of left side is always 'mid -1'
i = mid - 1
# Beginning of right side depends
# if n is odd or even
j = mid + 1 if (n % 2 ) else mid
# Initially, ignore the middle same digits
while (i > = 0 and num[i] = = num[j]) :
i - = 1
j + = 1
# Find if the middle digit(s) need to be
# incremented or not (or copying left
# side is not sufficient)
if ( i < 0 or num[i] < num[j]):
leftsmaller = True
# Copy the mirror of left to tight
while (i > = 0 ) :
num[j] = num[i]
j + = 1
i - = 1
# Handle the case where middle
# digit(s) must be incremented.
# This part of code is for CASE 1 and CASE 2.2
if (leftsmaller = = True ) :
carry = 1
i = mid - 1
# If there are odd digits, then increment
# the middle digit and store the carry
if (n % 2 = = 1 ) :
num[mid] + = carry
carry = int (num[mid] / 10 )
num[mid] % = 10
j = mid + 1
else :
j = mid
# Add 1 to the rightmost digit of the
# left side, propagate the carry
# towards MSB digit and simultaneously
# copying mirror of the left side
# to the right side.
while (i > = 0 ) :
num[i] + = carry
carry = int (num[i] / 10 )
num[i] % = 10
num[j] = num[i] # copy mirror to right
j + = 1
i - = 1
# The function that prints next
# palindrome of a given number num[]
# with n digits.
def generateNextPalindrome(num, n ) :
print ( "Next palindrome is:" )
# Input type 1: All the digits are 9, simply o/p 1
# followed by n-1 0's followed by 1.
if ( AreAll9s( num, n ) = = True ) :
print ( "1" )
for i in range ( 1 , n):
print ( "0" )
print ( "1" )
# Input type 2 and 3
else :
generateNextPalindromeUtil ( num, n )
# print the result
printArray (num, n)
# A utility function to check if num has all 9s
def AreAll9s(num, n ):
for i in range ( 1 , n):
if ( num[i] ! = 9 ) :
return 0
return 1
# Utility that prints out an array on a line
def printArray(arr, n):
for i in range ( 0 , n):
print ( int (arr[i]),end = " " )
print ()
# Driver Program to test above function
if __name__ = = "__main__" :
num = [ 9 , 4 , 1 , 8 , 7 , 9 , 7 , 8 , 3 , 2 , 2 ]
n = len (num)
generateNextPalindrome( num, n )
# This code is contributed by Smitha Dinesh Semwal


C#

// C# program to find next smallest  palindrome
using System;
public class GFG {
// Returns next palindrome of a given
// number num[]. This function is for
// input type 2 and 3
static void generateNextPalindromeUtil( int []num, int n)
{
int mid = n / 2;
// end of left side is always 'mid -1'
int i = mid - 1;
// Beginning of right side depends
// if n is odd or even
int j = (n % 2 == 0) ? mid : mid + 1;
// A bool variable to check if copy of left
// side to right
// is sufficient or not
bool leftsmaller = false ;
// Initially, ignore the middle same digits
while (i >= 0 && num[i] == num[j])
{
i--;
j++;
}
// Find if the middle digit(s) need to
// be incremented or not (or copying left
// side is not sufficient)
if (i < 0 || num[i] < num[j])
{
leftsmaller = true ;
}
// Copy the mirror of left to tight
while (i >= 0)
{
num[j++] = num[i--];
}
// Handle the case where middle digit(s)
// must be incremented. This part of code
// is for CASE 1 and CASE 2.2
if (leftsmaller)
{
int carry = 1;
// If there are odd digits, then increment
// the middle digit and store the carry
if (n % 2 == 1) {
num[mid] += 1;
carry = num[mid] / 10;
num[mid] %= 10;
}
i = mid - 1;
j = (n % 2 == 0 ? mid : mid + 1);
// Add 1 to the rightmost digit of the left
// side, propagate the carry towards MSB digit
// and simultaneously copying mirror of the
// left side to the right side.
while (i >= 0)
{
num[i] = num[i] + carry;
carry = num[i] / 10;
num[i] %= 10;
num[j] = num[i]; // copy mirror to right
i--;
j++;
}
}
}
// The function that prints next palindrome
// of a given number num[] with n digits.
static void generateNextPalindrome( int []num, int n)
{
Console.WriteLine( "Next Palindrome is:" );
// Input type 1: All the digits are 9,
// simply o/p 1 followed by n-1 0's
// followed by 1.
if (isAll9(num, n)) {
Console.Write( "1" );
for ( int i = 0; i < n - 1; i++)
Console.Write( "0" );
Console.Write( "1" );
}
// Input type 2 and 3
else {
generateNextPalindromeUtil(num, n);
printarray(num);
}
}
// A utility function to check if num has all 9s
static bool isAll9( int [] num, int n) {
for ( int i = 0; i < n; i++)
if (num[i] != 9)
return false ;
return true ;
}
/* Utility that prints out an array on a line */
static void printarray( int []num) {
for ( int i = 0; i < num.Length; i++)
Console.Write(num[i]+ " " );
Console.Write( " " );
}
// Driver code
public static void Main()
{
int []num = { 9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2 };
generateNextPalindrome(num, num.Length);
}
}
// This code is contributed by Smitha.


PHP

<?php
// PHP program to find next
// smallest palindrome
// Returns next palindrome
// of a given number num[].
// This function is for
// input type 2 and 3
function generateNextPalindromeUtil( $num , $n )
{
$mid = (int)( $n / 2);
// end of left side
// is always 'mid -1'
$i = $mid - 1;
// Beginning of right
// side depends if n
// is odd or even
$j = ( $n % 2 == 0) ?
$mid : ( $mid + 1);
// A bool variable to check
// if copy of left side to
// right is sufficient or not
$leftsmaller = false;
// Initially, ignore the
// middle same digits
while ( $i >= 0 &&
$num [ $i ] == $num [ $j ])
{
$i --;
$j ++;
}
// Find if the middle digit(s)
// need to be incremented or
// not (or copying left side
// is not sufficient)
if ( $i < 0 || $num [ $i ] < $num [ $j ])
{
$leftsmaller = true;
}
// Copy the mirror
// of left to tight
while ( $i >= 0)
{
$num [ $j ++] = $num [ $i --];
}
// Handle the case where
// middle digit(s) must be
// incremented. This part
// of code is for CASE 1
// and CASE 2.2
if ( $leftsmaller )
{
$carry = 1;
// If there are odd digits,
// then increment the middle
// digit and store the carry
if ( $n % 2 == 1)
{
$num [ $mid ] += 1;
$carry = (int)( $num [ $mid ] / 10);
$num [ $mid ] %= 10;
}
$i = $mid - 1;
$j = ( $n % 2 == 0 ?
$mid : $mid + 1);
// Add 1 to the rightmost digit
// of the left side, propagate
// the carry towards MSB digit
// and simultaneously copying
// mirror of the left side to
// the right side.
while ( $i >= 0)
{
$num [ $i ] = $num [ $i ] + $carry ;
$carry = (int)( $num [ $i ] / 10);
$num [ $i ] %= 10;
// copy mirror to right
$num [ $j ] = $num [ $i ];
$i --;
$j ++;
}
}
return $num ;
}
// The function that prints
// next palindrome of a given
// number num[] with n digits.
function generateNextPalindrome( $num , $n )
{
echo "Next Palindrome is:" ;
// Input type 1: All the
// digits are 9, simply
// o/p 1 followed by n-1
// 0's followed by 1.
if (isAll9( $num , $n ))
{
echo "1" ;
for ( $i = 0; $i < $n - 1; $i ++)
echo "0" ;
echo "1" ;
}
// Input type 2 and 3
else
{
$num = generateNextPalindromeUtil( $num , $n );
printarray( $num );
}
}
// A utility function to
// check if num has all 9s
function isAll9( $num , $n )
{
for ( $i = 0; $i < $n ; $i ++)
if ( $num [ $i ] != 9)
return false;
return true;
}
/* Utility that prints out
an array on a line */
function printarray( $num )
{
for ( $i = 0;
$i < count ( $num ); $i ++)
echo $num [ $i ];
echo "" ;
}
// Driver code
$num = array (9, 4, 1, 8, 7,
9, 7, 8, 3, 2, 2);
generateNextPalindrome( $num ,
count ( $num ));
// This code is contributed by mits.
?>


Javascript

<script>
// JavaScript program to find next smallest
// palindrome
// Returns next palindrome of a given
// number num. This function is for
// input type 2 and 3
function generateNextPalindromeUtil(num , n)
{
var mid = parseInt(n / 2);
// end of left side is always 'mid -1'
var i = mid - 1;
// Beginning of right side depends
// if n is odd or even
var j = (n % 2 == 0) ? mid : mid + 1;
// A bool variable to check if copy of left
// side to right
// is sufficient or not
leftsmaller = false ;
// Initially, ignore the middle same digits
while (i >= 0 && num[i] == num[j])
{
i--;
j++;
}
// Find if the middle digit(s) need to
// be incremented or not (or copying left
// side is not sufficient)
if (i < 0 || num[i] < num[j])
{
leftsmaller = true ;
}
// Copy the mirror of left to tight
while (i >= 0)
{
num[j++] = num[i--];
}
// Handle the case where middle digit(s)
// must be incremented. This part of code
// is for CASE 1 and CASE 2.2
if (leftsmaller)
{
var carry = 1;
// If there are odd digits, then increment
// the middle digit and store the carry
if (n % 2 == 1) {
num[mid] += 1;
carry = parseInt(num[mid] / 10);
num[mid] %= 10;
}
i = mid - 1;
j = (n % 2 == 0 ? mid : mid + 1);
// Add 1 to the rightmost digit of the left
// side, propagate the carry towards MSB digit
// and simultaneously copying mirror of the
// left side to the right side.
//when carry is zero no need to loop through till i>=0
while (i >= 0 && carry>0)
{
num[i] = num[i] + carry;
carry = parseInt(num[i] / 10);
num[i] %= 10;
num[j] = num[i]; // copy mirror to right
i--;
j++;
}
}
}
// The function that prints next palindrome
// of a given number num with n digits.
function generateNextPalindrome(num , n)
{
document.write( "Next Palindrome is: <br>" );
// Input type 1: All the digits are 9,
// simply o/p 1 followed by n-1 0's
// followed by 1.
if (isAll9(num, n)) {
document.write( "1" );
for (i = 0; i < n - 1; i++)
document.write( "0" );
document.write( "1" );
}
// Input type 2 and 3
else {
generateNextPalindromeUtil(num, n);
printarray(num);
}
}
// A utility function to check if num has all 9s
function isAll9(num , n) {
for (i = 0; i < n; i++)
if (num[i] != 9)
return false ;
return true ;
}
/* Utility that prints out an array on a line */
function printarray(num) {
for (i = 0; i < num.length; i++)
document.write(num[i]+ "" );
}
var num = [ 9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2 ];
generateNextPalindrome(num, num.length);
// This code is contributed by 29AjayKumar
</script>


输出

Next palindrome is:9 4 1 8 8 0 8 8 1 4 9 

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享