【python】奥数题

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
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bessie_Lee_gogogo

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值