Python实现带幂运算和平方根的算术表达式的计算

直接写程序,基于3.0
PS:没做算术表达式是否合规的判断

注意:
1、负数用()包起来
2、开平方根sqrt()
3、幂运算用 ^

def cal(arr):
    p=0
    addsub=0
    muldiv=0
    muldivindex=0
    while arr.find('sqrt')>=0:
        arr=cal_sqrt(arr)
    while arr.find('^')>=0:
        arr=cal_power(arr)
    if arr[0]=="-":
       arr="0"+arr
        

    for i in range(len(arr)-1,-1,-1):
        if arr[i]=="(":
            p+=1
        elif arr[i]==")":
            p-=1
        elif (arr[i]=="+" or arr[i]=="-") and p==0:
            addsub+=1
            break
        elif (arr[i]=="*" or arr[i]=="/") and p==0 and muldiv==0:
            muldiv=+1
            muldivindex=i
    if p==0 and addsub==0 and muldiv==0 and arr[0]=="(" and arr[len(arr)-1]==")":
        return cal(arr[1:len(arr)-1])
    if p==0 and arr.find('+')==-1 and arr.find('-')==-1 and arr.find('*')==-1 and arr.find('/')==-1:
        return float(arr)
    if addsub!=0:
        if arr[i]=="+":
            return cal(arr[0:i])+cal(arr[i+1:len(arr)])
        elif arr[i]=="-":
            return cal(arr[0:i])-cal(arr[i+1:len(arr)])
    if muldiv!=0:
        if arr[muldivindex]=="*":
            return cal(arr[0:muldivindex])*cal(arr[muldivindex+1:len(arr)])
        elif arr[muldivindex]=="/":
             if cal(arr[muldivindex+1:len(arr)])==0:
                print("无解")
                sys.exit(0)
             else:
                return cal(arr[0:muldivindex])/cal(arr[muldivindex+1:len(arr)])




def cal_sqrt(arr):
    a=arr
    p=0
    b=""
    c=""
    arr=arr[arr.find('sqrt')+4:len(arr)]
    for j in range(len(arr)):
        if arr[j]=="(":
            p+=1
        elif arr[j]==")":
            p-=1
        if p==0:
            c="sqrt"+arr[0:j+1]
            if cal(arr[0:j+1])<0:
                print("无解")
                sys.exit(0)
            else:
                b=str(math.sqrt(cal(arr[0:j+1])))
            a=a.replace(c,b)   
            return a

def cal_power(arr):
    a=arr
    p=0
    up=""
    down=""
    index=arr.find('^')
    q=0
    for i in range(index+1,len(arr),1):
        if arr[index+1]=="(":
            if arr[i]=="(":
                p+=1
            elif arr[i]==")":
                p-=1
        if p==0 and (i==len(arr)-1 or a[i+1] not in '0123456789.'):
            for j in range(index-1,-1,-1):
                if arr[index-1]==")":
                    if arr[j]==")":
                            q-=1
                    elif arr[j]=="(":
                            q+=1
                if q==0 and (j==0 or a[j-1] not in '0123456789.'):
                    b=str(math.pow(cal(arr[j:index]),cal(arr[index+1:i+1])))
                    c=arr[j:index]+"^"+arr[index+1:i+1]
                    a=a.replace(c,b)
                    return a




import math,sys
s="((-2)-3)^(3+4)"
if cal(s):print(cal(s))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值