1、商品编号问题
某商品的编号是一个三位数,现有五个三位数:874,765,123,364,925。
其中每个数与商品编号,恰好在同一位上有一个相同的数字,那么这个三位数是?
a = [8, 7, 1, 3, 9] # 百位
b = [7, 6, 2, 6, 2] # 十位
c = [4, 5, 3, 4, 5] # 个位
# 思路2:暴力解法
'''
1、先列出全部的可排列
2、依次比较次数
'''
# 1、全排列(除)
n = set([]) # 放置存在的数
for i in range(5):
for j in range(5):
if i == j:
continue
else:
for k in range(5):
if i == k or j == k:
continue
else:
n.add(a[i]*100+b[j]*10+c[k])
print("全排列:",n)
print("一共数量:",len(n))
# 2、依次比较次数
for q in n:
m = [0, 0, 0, 0, 0] # 用来判断
# 每一个用来与百位,十位,个位判断,然后把数输入到m中,最后判断全为1的即为正确答案
for p1 in range(5):
if a[p1] == q//100:
m[p1] = m[p1]+1
for p2 in range(5):
if b[p2] == q%100//10:
m[p2] = m[p2]+1
for p3 in range(5):
if c[p3] == q%10:
m[p3] = m[p3]+1
count = 0
for w in m:
if w == 1:
count = count + 1
if count == 5:
print("三位数是:",q)
'''输出结果:
全排列: {773, 774, 775, 924, 925, 164, 165, 174, 175, 823, 824, 825, 323, 324, 325, 964, 963, 965, 973, 974, 975, 723, 724, 725, 863, 864, 865, 363, 364, 365, 124, 125, 373, 375, 763, 764, 765}
一共数量: 37
三位数是: 724
'''
2、三位数选取问题
从 0、3、5、7 中选出三个数字能排成_______个三位数
其中能被 5 整除的三位数有________个。
# 三个for循环,4的3次方=64次
# 计算三位数
a = [3, 5, 7, 0]
b = []
for i in a:
# 位首不为0
if i != 0:
for j in a:
# 十位参数不可反复使用
if(i == j):
# 相同后,直接下一轮循环,而不是退出循环
continue
else:
for k in a:
# 个位参数不可反复使用
if (k == i or k == j):
continue
else:
c = i*100+j*10+k
b.append(c)
print('数量:',len(b))
# 计算整除
count = 0
for m in b:
if m%5 == 0:
count = count + 1
print(m, end = ' ')
print()
print('数量:',count)
'''输出结果:
数量: 18
350 375 370 305 530 570 735 730 750 705
数量: 10
'''
3、值勤民警问题
外宾由甲地经乙地、丙地去丁地参观。
甲、乙、丙、丁四地和甲乙、乙丙、丙丁的中点,原来就各有一位民警值勤。
为了保证安全,上级决定在沿途增加值勤民警,并规定每相邻的两位民警(包括原有的民警)之间的距离都相等。
现知甲乙相距 5000 米,乙丙相距 8000 米 丙丁相距4000 米 那么一共至少需要______位民警。
# 思路:先求最大公约数,再用距离相除,最后互相减去1再相加
# 目前已知三个警察,ABC,AB之间相距6500,BC之间相距6000
m = 6500
n = 6000
# 最大公约数:m输入的时候大于n
def GCD(m,n):
result = 0
while n!=0:
result = m%n
m = n
n = result
return m
a = GCD(m,n)
# 至少需要人员
b = (m//a-1)+(n//a-1)
print('至少需要人员:',b)
'''输出结果:
至少需要人员: 23
'''
4、商店进货问题
某商店有一天,估计将进货单价为 90 元的某商品按 100 元售出后,能卖出 500 个。已知这种商品每个涨价 1 元,其销售量就减少 10 个。为了使这一天能赚得更多利润,售价应定为每个多少元。
# 限制:销售量 > 0 即可; n属于0-50
# 利润:w = (n-90)*(500-(n-100)*10)
# 最开始的w为5000
w = 5000
n = 0
for i in range(100,151):
a = (i-90)*(500-(i-100)*10)
if a>w:
w = a
n = i
print("售价:",n,";利润为:",w)
'''输出结果:
售价: 120 ;利润为: 9000
'''
5、添加运算符得到结果
在下列算式中合适的地方添上+、-、/、 ×,使等式成立。
2 4 6 8=24
a = [2,4,6,8]
b = ['+','-','x','/']
# 表达式变成后缀表达式
def generate_postfix(infix):
"""
generate postfix expression str
:param infix: infix expression str, like '2x3+8/3'
:return: postfix expression str, like '23x83/+'
infix = []
for i in range(4):
for j in range(4):
for k in range(4):
infix.append(2,i,4,j,6,k,8)
"""
op_rank = {'x': 2, '/': 2, '+': 1, '-': 1} # 定义加减乘除的优先级
stack = [] # 用list模拟栈的后进先出
post_list = []
for s in infix:
if s in '+-x/': # operator
# 栈不为空,且栈顶运算符的优先级高于当前运算符
while stack and op_rank.get(stack[-1]) >= op_rank.get(s): # priority
post_list.append(stack.pop())
stack.append(s)
else: # operand
post_list.append(s)
while stack:
post_list.append(stack.pop())
return ''.join(post_list)
# 后缀表达式计算
def calculate_postfix(postfix):
"""
calculate postfix expression
:param postfix: postfix expression str, like '23x83/+'
:return: int result, like 2x3+8/3=6+2=8
"""
stack = [] # 用list模拟栈的后进先出
for p in postfix:
if p in '+-x/': # operator
value_2 = float(stack.pop()) # 第二个操作数
# print(value_2)
value_1 = float(stack.pop()) # 第一个操作数
# print(value_1)
if p == '+':
result = value_1 + value_2
elif p == '-':
result = value_1 - value_2
elif p == 'x':
result = value_1 * value_2
else: # 整除
result = value_1 / value_2
stack.append(result)
# print(stack)
else:
stack.append(p)
return stack.pop()
infix = []
for i in b:
for j in b:
for k in b:
c = '2'+i+'4'+j+'6'+k+'8'
infix.append(c)
for m in infix:
a = calculate_postfix(generate_postfix(m))
if a == 24.0:
print(m,'= 24')
'''输出结果:
2/4x6x8 = 24
'''