• 【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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    '''输出结果:
    全排列: {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
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    '''输出结果:
    数量: 18
    350 375 370 305 530 570 735 730 750 705 
    数量: 10
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    '''输出结果:
    至少需要人员: 23
    '''
    
    • 1
    • 2
    • 3

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    '''输出结果:
    售价: 120 ;利润为: 9000
    '''
    
    • 1
    • 2
    • 3

    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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    '''输出结果:
    2/4x6x8 = 24
    '''
    
    • 1
    • 2
    • 3
  • 相关阅读:
    旺季来袭,独立站卖家需要注意哪些
    用了这么久SpringBoot却还不知道的一个小技巧
    计算机网络_网络层概述
    各类Linux操作系统如何选择?
    Linux系统编程6(线程互斥,锁,同步,生产消费模型)
    Notion 类笔记软件的使用误区和反思
    leetcode链表系列(环形链表篇)
    直播美颜SDK对比评测:技术原理与应用实践
    NVIDIA控制面板进行设置时提示“无法应用选定的设置到您的电脑”的解决办法(更新显卡驱动的方法)
    Nodejs和Node-red的关系
  • 原文地址:https://blog.csdn.net/weixin_42198265/article/details/125602685