我在洛谷题库 P1015中,遇到了RE问题,
题目描述:
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数 56,将 56 加 65(即把 56 从右向左读),得到 121 是一个回文数。
又如:对于十进制数 87:
STEP1:87 + 78 = 165
STEP2:165 + 561 = 726
STEP3:726 + 627 = 1353
STEP4:1353 + 3531 = 4884
在这里的一步是指进行了一次 N 进制的加法,上例最少用了 4 步得到回文数 4884。
写一个程序,给定一个 N(2≤N≤10 或 N=16)进制数 M(100 位之内),求最少经过几步可以得到回文数。如果在 30 步以内(包含 30 步)不可能得到回文数,则输出 Impossible!。
输入格式
两行,分别是 N,M。
输出格式
如果能在 30 步以内得到回文数,输出格式形如 STEP=ans,其中 ans 为最少得到回文数的步数。否则输出 Impossible!。
我的程序是这样的:
# 将 字符串 转为 整数
def toInt(n):
if n.islower():
return ord(n) - 87
elif n.isupper():
return ord(n) - 55
return int(n)
# 将 整数 转为 字符串
def toStr(n):
if n < 10:
return str(n)
return chr(n + 87)
N = int(input())
M = str(input())
sEd = 0
for i in range(0, 30):
memory = ""
memoryAdd = 0
for j in range(len(M)):
memory += toStr((toInt(M[j]) + toInt(M[len(M) - 1 - j]) + memoryAdd) % N)
memoryAdd = (toInt(M[j]) + toInt(M[len(M) - 1 - j]) + memoryAdd) // N
if memoryAdd:
memory += toStr(memoryAdd)
M = memory[::-1]
if M == memory:
sEd = 1
print("STEP={0}".format(i + 1), end="")
break
if sEd == 0:
print("Impossible!", end="")
OJ测评结果截图:
将输入的那两句加上 strip() 即可
N = int(input().strip())
M = str(input().strip())
不是你的错,洛谷里的题目是为C++设计的,所以输入的部分没有考虑python的使用习惯,给出的数字有时候后面会包含多余的空格或换行符,用strip()函数去除即可。
如果遇到那种输入的空格也是字符串的一部分的题目时,最好使用下面这种方式来获得输入:
import sys
s = sys.stdin.readline() # 单行输入
说好的输入为n进制数m,您把大小写英文字母字符串转来转去我看不懂了。
在 Python 中,除了十进制都是用字符串表示整数。我认为是,输入n进制整数m,就要用n进制来对m进行加运算。十进制简单,直接搞。但其他进制就有些难搞。我觉得,可以都用十进制进行加运算,再n进制检查是否已达成回文条件。这样子的算法,相对容易一些,只需n进制与十进制相互转换就好,n进制转换十进制有现成的int()函数,我们只需写一个十进制转换n进制的模块,这题目就有解了的样子。
想法有了,我也试试去……