zoukankan      html  css  js  c++  java
  • 练习:求字符串中最长的表达式,并计算结果--python实现

    1、判断字符串长度、最长的表达式

    """
    1、所有数字,计算长度不能超过long
    2、如果有多个长度一样,请返回第一个表达式结果
    3、数学表达式必须要是最长的,合法的
    4、操作符不能是连续的,如 +--+1是不合法的
    
    """
    
    import re
    
    s = input("请输入字符串:")
    
    #保留只有0-9 +-*字符
    list1 = re.findall("[-+*0-9]+",s)
    s0 = ""
    for s1 in list1:
        lens = 0
        T = True
        for s2 in s1:#判断是否有连续的运算符
            if s2 in ["-","+","*"]:
                lens+=1
                if lens > 1:
                    print("不合法表达式:",s1)
                    T = False
                    break
            else:
                lens = 0
        if T:#求出最长的表达式
            if len(s0)<len(s1):
                s0 = s1
    
    if s0 == "":
        A=0
    else:
        if s0[0] == "*":
            s0 = s0[1:]
            if s0.find("*") == 1:
                print("暂时无法计算乘法:",s0)
            else:
                A = eval(s0)
        else:
            if s0.find("*") == 1:
                print("暂时无法计算乘法:", s0)
            else:
                A = eval(s0)
    print(A)
    

      

    2、计算器方法--百度的方法

    # judgment a char is a operation or not
    from pip._vendor.distlib.compat import raw_input
    
    
    def is_operation(oper):
        if oper == '+' or oper == '-' or oper == '*' or oper == '/':
            return True
        else:
            return False
    
    
    # split expression
    def mixed_operation(exp):
        exp_list = list(exp)
        temp = ''
        behavor_list = []
        i = 0
        length = len(exp_list)
        for item in exp_list:
            if is_operation(item):
                behavor_list.append(int(temp))
                behavor_list.append(item)
                temp = ''
            else:
                temp += item
    
            if i == length - 1:
                behavor_list.append(int(temp))
                break
            i += 1
    
        return behavor_list
    
    
    # cal a o b
    def get_aob(a, o, b):
        if o == '+':
            return a + b
        elif o == '-':
            return a - b
        elif o == '*':
            return a * b
        elif o == '/':
            return a / b
    
    
    # Calculation op1 and op2('*' and '/' or '+' and '-')
    def cal_op1_op2(exp_list, op1, op2):
        if len(exp_list) == 1:
            return exp_list
    
        i = 0
        has_op = False
        for i in range(2, len(exp_list), 2):
            a = exp_list[i - 2]
            o = exp_list[i - 1]
            b = exp_list[i]
            if o == op1 or o == op2:
                has_op = True
                exp_list[i - 2] = get_aob(a, o, b)
                del exp_list[i]
                del exp_list[i - 1]
                break
    
        if has_op == False:
            return exp_list
    
        return cal_op1_op2(exp_list, op1, op2)
    
    
    # cal exp
    def cal_exp(exp_list):
        exp_list = cal_op1_op2(exp_list, '*', '/')
        exp_list = cal_op1_op2(exp_list, '+', '-')
    
        return exp_list[0]
    
    # while True:
    expre = input('Enter your expression(0 to end):')
        # if expre == '0':
        #     break
    
    result = mixed_operation(expre)
    print('list result = ',result)
    print(cal_exp(result))
    
    #print ('END')
    

      

    遗留问题解决方法:

    计算器方法里没有判断表达式首字符是运算符情况,加个判断,再使用上计算器方法结合,就能计算合法的最长表达式结果了。

    2021-1-2,笔记

  • 相关阅读:
    微信分享 apicloud方式 中遇到的坎
    css之颜色篇
    css总结
    记一些茅塞顿开的事情
    apicloud
    安装MySQL
    智能家居
    java
    数据库设计好不好,分配很重要。
    WP8.1的shell:SystemTray去哪了?
  • 原文地址:https://www.cnblogs.com/yuntimer/p/14222827.html
Copyright © 2011-2022 走看看