Python大学编程问题

(5123321是一个非常特殊的数,从左边读和从右边读是一祥的,称这样的数为回文数。输入一个正整数n(1≤n≤54),編程求各位数字之和等于n的5位和6位十进制回文数。按从小到大的顺序输出满足条件的整数。如果输入的数不在指定的范围,输出“ 输入错误,请重新输入!",如果没有各位之和与输入的数相等的5位和6位回文数,输出“无满足条件的数!”


n = int(input())
assert 1<=n<=54,("输入错误,请重新输入!")
b = []
a = 0
for i in range(10000,1000000):
    if str(i) == str(i)[::-1]:
        for j in str(i):
            a += int(j)
        if a == n:
            b.append(i)
    a = 0
if len(b) == 0:
    print("无满足条件的数!")
else:
    print(*b)

其实只需枚举前三位即可,由前三位可得到一个唯一的5位或6位回文数,得到结果后检查是否符合条件。
代码:

from itertools import product

string = input()
try:
    n = int(string)
except ValueError:
    print("输入错误,请重新输入!")
    exit()

if n < 1 or n > 54:
    print("输入错误,请重新输入!")
    exit()

# 记录是否有符合条件的数
have_answer = False

# 五位
# 使用itertools.product与三重for ... range等价,注意第一位从1开始
for a, b, c in product(range(1, 10), range(10), range(10)):
    if a * 2 + b * 2 + c == n: # 判断是否符合条件
        print(a, b, c, b, a, sep='')
        have_answer = True

# 六位
for a, b, c in product(range(1, 10), range(10), range(10)):
    if 2 * (a + b + c) == n:
        print(a, b, c, c, b, a, sep='')
        have_answer = True

if not have_answer:
    print("无满足条件的数!")

另外这种算法已经保证了输出顺序,无需再次排序。

Error = '输入错误,请重新输入!'
while True:
    try:
        n = int(input('请输入一个正整数n(1≤n≤54):'))
    except:
        print(Error)
        continue
    if 1<=n<=54:
        break
    else:
        print(Error)
        
res = []

for i in range(10_000,1_000_000):
    if str(i) == str(i)[::-1] and sum(map(int,str(i)))==n:
        res.append(i)

if res:
    print(*res)
else:
    print("无满足条件的数!")

光邀请,不采纳。。。累了