直接写程序,基于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))