回文数字
题目描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入 | 一个正整数 n (10< n< 100), 表示要求满足的数位和。 |
---|---|
输出 | 若干行,每行包含一个满足要求的5位或6位整数。 数字按从小到大的顺序排列。 如果没有满足条件的,输出:-1 |
分析
拿到这样的题目,我们可以从两个方面来入手的.
plan A
第一个方面是从这个范围开始,既然题目说的是仅限的五位数和六位数,但是我们直接可以通过循环的1000到100000来找到所有的回文数并与之匹配,附上这方法一的废物的python代码
n = int(input())
flag = False # 判定是否返回 - 1的布尔运算
for i in range(10):
for j in range(10):
for k in range(10):
if (i * 2 + j * 2 + k == n):
print(i * 10000 + j * 1000 + k * 100 + j * 10 + i)
flag = True
for i in range(10):
for j in range(10):
for k in range(10):
if (i * 2 + j * 2 + k * 2 == n):
print(i * 100000 + j * 10000 + k * 1000 + k * 100 + j * 10 + i)
flag = True
if flag == False:
print(-1)
浅显易懂,好耶
しかし
时间复杂度O(n ^ 3)
这好吗,这不好
所以我们有bear而来。
plan B
我们从的这个n以及回文串的本身来入手,如果这样数字满足的回文的串的话,那么这个数字本身就是就是可以作为一个已知数来代替的。
小二!上优化后的代码
n = int(input())
flag = False
for i in range(1,10):
for j in range(10):
k = n - 2 * i - 2 * j
if k >= 0 and k < 10:
print(i * 10000 + j * 1000 + k * 100 + j * 10 + i)
flag = True
for i in range(1,10):
for j in range(10):
k = n - 2 * i - 2 * j
if (k % 2 == 0 and k // 2 < 10) and k // 2 >= 0:
print(i * 100000 + j * 10000 + (k//2) * 1000 + (k//2) * 100 + j * 10 + i)
flag = True
if flag == False:
print(-1)
这里理解的难点就在于这样的范围设置,我们的得出的k需要设置在什么样的范围内。首先就是对于五位数而言,我们中间的这样一个k必须要满足中心的k大于的0并且k < 10
对于六位数的数字自然也是同理可以得到,被二整除并且结果要大于0小于10,
嘿嘿
时间复杂度O(n ^ 2)
好耶
最后
附上狗妈的图
DD斩首!!!