Next Palindrome号码

时间:2014-09-02 05:32:30

标签: python algorithm

我是编程的初学者,那么请告诉我我的代码有什么问题?

如果用户输入的数字(n)不是回文,我想打印下一个回文编号

n = int(input("Enter any number :- "))

reverse = 0
temp = n

while (n!=0):
    reverse = reverse * 10
    reverse = reverse + n%10
    n=n//10 
if(temp==reverse):
    print ("Already palindrome:: ")

if(temp != reverse):
     new_temp = temp
     new_reverse = 0
     for i in range(new_temp,new_temp+10):
        while(temp != 0):
            new_reverse = new_reverse * 10
            new_reverse = new_reverse + temp%10
            temp = temp//10
         if(new_temp==new_reverse):
             print ("Next pallindrome is :- ",new_temp)
             break
         if(new_temp != new_reverse):
             temp = new_temp+1

12 个答案:

答案 0 :(得分:3)

要检查数字是否为回文数,您不需要将其转换为数字。事实上,如果你只检查相当于你的数字的字符串,它就会简单得多。

>>> i = '212'
>>> i == i[::-1]
True
>>> i = '210'
>>> i == i[::-1]
False

使用此优势,并创建一个功能:

def is_palindrome(foo):
   return str(foo) == str(foo)[::-1]

接下来,要找到 next 回文,只需增加数字,直到你的回文检查为真。

结合所有这些,你有:

def is_palindrome(n):
    return str(n) == str(n)[::-1]

n = raw_input('Enter a number: ')
if is_palindrome(n):
   print('Congratulations! {0} is a palindrome.'.format(n))
else:
   n1 = n
   while not is_palindrome(n1):
       n1 = int(n1)+1
   print('You entered {0}, but the next palindrome is {1}'.format(n, n1))

以下是它的工作原理:

$ python t.py
Enter a number: 123
You entered 123, but the next palindrome is 131
$ python t.py
Enter a number: 121
Congratulations! 121 is a palindrome.

答案 1 :(得分:3)

您的代码存在两个问题。

1)你的"对于我的范围" loop计算temp变量的反转,但是你不能改变temp变量的值。 你做了

 new_temp = temp
 for i in range(new_temp,new_temp+10):
    [SNIP]
    if(new_temp != new_reverse):
         temp = new_temp+1 #this value never changes.

所以你要用一个相同的值进行10次迭代。

2)十次迭代可能不足以找到回文。继续往下走,直到找到回文。

工作代码:

def reverse(num):
    reverse= 0
    while num:
        reverse= reverse*10 + num%10
        num= num//10
    return reverse

num= int(input("Enter any number :- "))
if num==reverse(num):
    print ("Already palindrome.")
else:
    while True:
        num+= 1
        if num==reverse(num):
            print ("Next palindrome is : %s"%num)
            break

答案 2 :(得分:2)

如果有帮助,我相信用 n / 2 次迭代可以解决这个问题,其中 n 是输入数字的长度。这是我在Python中的解决方案:

def next_palin_number(number):
    # Convert the number to a list of its digits.
    number = list(str(number))
    # Initialize two indices for comparing symmetric digits.
    i = 0
    j = len(number) - 1
    while i < j:
        # If the digits are different:
        if number[i] != number[j]:
            # If the lower-power digit is greater than the higher-power digit:
            if int(number[j]) > int(number[i]):
                number[j - 1] = str(int(number[j - 1]) + 1)
                number[j] = number[i]
            else:
                number[j] = number[i]
        i += 1
        j -= 1
    # Concatenate and return the result.
    return "".join(number)

答案 3 :(得分:0)

如果给出明确的范围: -

函数检查数字是否为回文

def palin(x):                 
    s=str(x)
    if s==s[::-1]:
        return True
    else:
        return False

n=int(input("Enter the number"))

从下一个数字到15位

的范围
for i in range(n+1,int(10e14)):
    if palin(i) is True:
        print(i)
        break

答案 4 :(得分:0)

这个问题有很多方法可以解决它们。

其中一个是

def nearest_palindrome(number):
    #start writitng your code here
    while True:
        number+=1
        if str(number) == str(number)[::-1]:
            return number 

number=12300
print(nearest_palindrome(number))

感谢您抽出时间阅读我的答案:)

答案 5 :(得分:0)

使用函数查找下一个回文

def nearest_palindrome(number):
if number>0:
    i=1
    while(number):
        n=number+i
        temp=n
        sum=0
        while n>0:
            rem=n%10
            sum=sum*10+rem
            n=n//10
        if temp==sum:

            return temp
            #break
        else:
            sum=0
            i=i+1
        #continue
number=12300
print(nearest_palindrome(number))

答案 6 :(得分:0)

**

def nearest_palindrome(number):
    n = len(str(number))//2
    if(len(str(number)) % 2 == 0):
        #number like 1221
        number_1 = int((str(number))[:n]) #12
        number_2 = int((str(number))[n:]) #21
        if(number_1 < number_2):
            number_1 += 1
            number_2 = int(str(number_1)[::-1])
        else:
            number_2 = int(str(number_1)[::-1])
        # if last half part is zero then just reverse the first number
        if number_2 == 0:
            number_2 = str(number_1)[::-1]
        #combining the both parts
        ans = int(str(number_1) + str(number_2))
        return ans
    else:
        #numer like 12510   n=2
        nu = int((str(number))[:n+1]) #add in this number
        number_1 = int((str(number))[:n])  # 12
        number_2 = int((str(number))[n+1:])  # 21
        if (number_1 < number_2):
            nu += 1
            number_2 = int((str(nu))[::-1][1:])
        else:
            number_2 = int((str(nu))[::-1][1:])
        #if last half part is zero then just reverse the first number
        if number_2 == 0:
            number_2 = str(nu)[::-1]
            number_2 = number_2[1:]
        #combinning both parts
        ans = int(str(nu) + str(number_2))
        return ans
number=12331
print(nearest_palindrome(number))

**

答案 7 :(得分:0)

我写这篇文章是为了找到给定pallindrome号的下一个pallindrome号。

def palindrome(num):
    bol=False
    #x=len(str(num))
    num=num+1
    while(bol==False):
        if(check_palindrome(num)):
            bol=True
        else:
            num=num+1
    return num
def check_palindrome(n):
    temp=n
    rev=0
    while(n>0):
        dig=n%10
        rev=rev*10+dig
        n=n//10
    if(temp==rev):
        return True

b=palindrome(8)
print(b)

答案 8 :(得分:0)

<canvas id="result" width="640" height="450" style="position: absolute;border: 1px solid;"></canvas>

输出:12321

答案 9 :(得分:0)

def nearest_palindrome(number):

    for i in range(1,number):
        number=number+1
        tem=str(number)
        tem1=tem[-1::-1]
        if(tem==tem1):
            return number
        else:
            continue

number=12997979797979797

print(nearest_palindrome(number))

答案 10 :(得分:0)

一种蛮力方法:

def math(n):
    while not var:
        n += 1   
        if str(n) == str(n)[::-1] : f = 'but next is : '+str(n); return f
n = int(input()); t = math(n); print('Yes',t) if str(n) == str(n)[::-1] else print('No',t); global var; var = False

答案 11 :(得分:-1)

我写这篇文章的目的是在给定pallindrome号的情况下查找下一个pallindrome号。

for

#同样针对此问题,取给定数字的左侧部分...反转..将其存储在温度中

#given a pallindrome number ..find next pallindrome number
input=999
inputstr=str(input)

inputstr=inputstr
#append 0 in beginning and end of string ..in case like 99 or 9999
inputstr='0'+inputstr+'0'
length=len(inputstr)
halflength=length/2;
#if even length
    if(length%2==0):
    #take left part and reverse it(which is equal as the right part )
    temp=inputstr[:length/2]
    temp=temp[::-1]
    #take right part of the string ,move towards lsb from msb..If msb is 9 turn it to zero and move ahead
    for j,i in enumerate(temp):
        #if number is not 9 then increment it and end loop
        if(i!="9"):

            substi=int(i)+1
            temp=temp[:j]+str(substi)+temp[j+1:]
            break;
        else:

            temp=temp[:j]+"0"+temp[j+1:]
    #now you have right hand side...mirror it and append left and right part
    output=temp[::-1]+temp
#if the length is odd
    if(length%2!=0 ):
    #take the left part with the mid number(if length is 5 take 3 digits
        temp=inputstr[:halflength+1]
    #reverse it
        temp=temp[::-1]
    #apply same algoritm as in above
    #if 9 then make it 0 and move on
    #else increment number and break the loop
        for j,i in enumerate(temp):

            if(i!="9"):

                substi=int(i)+1
                temp=temp[:j]+str(substi)+temp[j+1:]
                break;
            else:

                temp=temp[:j]+"0"+temp[j+1:]
    #now the msb is the middle element so skip it and copy the rest
        temp2=temp[1:]
    #this is the right part mirror it to get left part then left+middle+right isoutput
        temp2=temp2[::-1]
        output=temp2+temp
    print(output)