题干
- p1.jpg如下,即颠倒可读。
思路
-
首先因为是填空题,所以不需要刻意考虑时间复杂度,优先考虑枚举。
-
根据题意我们逐步分析,4位数字,其中
1 2 5 6 8 9 0
可颠倒 -
因为需要可读性,所以首位不能为0,所以枚举{1,2,5,6,8,9,0}中的4位数
-
由于{1,2,5,8,0}颠倒后,无可读性,故颠倒的方法定义只针对6和9即可(即逢6换9,逢9换6)
-
简单筛选变量
temp1
与temp2
,找出赔200多,即[-300:-200];赚800多,即[800:900],满足条件的temp1,2
-
最后遍历两个集合,检查相加是否为558,打印出来,就可以得出赔钱的原价是多少(注意是赔钱的哦!!!)
代码
代码实现基本就着思路来,问题不大
# 定义可读颠倒数字方法:
def swap_cost(n:int):
if(n==6):return 9
elif(n==9):return 6
else:return n
a = [] # 存放赔的(原价,颠倒价,差价)
b = [] # 存在赚的(原价,颠倒价,差价)
sw = {1,2,5,6,8,9,0} # 可颠倒的数字
# 枚举可颠倒的数字,缩小枚举范围
for i in sw:
for j in sw:
for m in sw:
for n in sw:
if i!=0 and n!=0:
temp1 = i*1000+j*100+m*10+n
#原价 ijmn
temp2 = swap_cost(n)*1000+swap_cost(m)*100+swap_cost(j)*10+swap_cost(i)
#颠倒价,注意数字变化的同时还要价位反转 nmji
check1 = temp2-temp1
#和原价做差
if(check1<-200 and check1>-300):
a.append((temp1,temp2,check1)) # 以元组形式存放在列表里
if(check1<900 and check1>800):
b.append((temp1,temp2,check1)) # 以元组形式存放在列表里
# print(a) # 赔
# print(b) # 赚
for i in a:
for j in b:
c1 = i[2]
c2 = j[2]
#赔赚的数额
check2 = c1+c2
if check2==558:print(i,j)
"""
>>
(9088, 8806, -282) (1061, 1901, 840)
(9088, 8806, -282) (2062, 2902, 840)
(9088, 8806, -282) (5065, 5905, 840)
(9088, 8806, -282) (6069, 6909, 840)
(9088, 8806, -282) (8068, 8908, 840)
(9088, 8806, -282) (9066, 9906, 840)
"""
"""正确答案显而易见是:9088"""
总结
简单的位数变换+check检查,需要仔细读题,用时大概15-20分钟吧,思路出来代码就好上手了,继续加油~