#46465: 求援助(65%)


linswater (linswater)

學校 : 國立武陵高級中學
編號 : 297974
來源 : [36.224.93.12]
最後登入時間 :
2025-10-05 16:14:00

請問為什麼大部分都可以AC少部分卻不行,而且錯誤的值和正確答案差超多。(裡面那個c函數其實是我自製的eval函式,功能理論上完全一樣)

程式的內容有點像是一條式子1+2*3+4我先算2*3,再把原式中的2*3塗掉,用6代替,變成1+6+4。

countlist = input()
head,end = 0,0
count = ''
def c(expr):
    tokens = expr.replace(' ', '')
    num, stack, op = '', [], '+'
    for i, ch in enumerate(tokens + '+'):  # 在結尾加個 '+' 觸發最後一次計算
        if ch.isdigit() or ch == '.':
            num += ch
        else:
            if num:
                n = float(num)
                if op == '+': stack.append(n)
                elif op == '-': stack.append(-n)
                elif op == '*': stack[-1] *= n
                elif op == '/': stack[-1] /= n
                num = ''
            op = ch
    return sum(stack)
def counting(a):
    string = a.split("*")
    for i in range(len(string)):
        string[i] = str(c(string[i]))
    answer = c("*".join(string))
    return answer
while '(' in countlist:
    for i in range(len(countlist)):
        if countlist[i] == '(':
            head = i-1
        if countlist[i] == ')':
            end = i+1
            break
    count = countlist[head:end]
    sliceCount = count[2:len(count)-1]
    sliceCountList = sliceCount.split(",")
    for i in range(len(sliceCountList)):
        if ("*" in sliceCountList[i]) or ("+" in sliceCountList[i]):
            sliceCountList[i] = counting(sliceCountList[i])
        else:
            sliceCountList[i] = float(sliceCountList[i])
    answer = max(sliceCountList) - min(sliceCountList)
    countlist = countlist.replace(count,str(answer))
print(int(c(countlist)))

#46466: Re: 求援助(65%)


leeguanhan0909@gmail.com (李冠翰)

學校 : 高雄市苓雅區復華高級中學國中部
編號 : 276558
來源 : [36.238.189.188]
最後登入時間 :
2025-06-11 22:19:49

請問為什麼大部分都可以AC少部分卻不行,而且錯誤的值和正確答案差超多。(裡面那個c函數其實是我自製的eval函式,功能理論上完全一樣)

程式的內容有點像是一條式子1+2*3+4我先算2*3,再把原式中的2*3塗掉,用6代替,變成1+6+4。

countlist = input()
head,end = 0,0
count = ''
def c(expr):
    tokens = expr.replace(' ', '')
    num, stack, op = '', [], '+'
    for i, ch in enumerate(tokens + '+'):  # 在結尾加個 '+' 觸發最後一次計算
        if ch.isdigit() or ch == '.':
            num += ch
        else:
            if num:
                n = float(num)
                if op == '+': stack.append(n)
                elif op == '-': stack.append(-n)
                elif op == '*': stack[-1] *= n
                elif op == '/': stack[-1] /= n
                num = ''
            op = ch
    return sum(stack)
def counting(a):
    string = a.split("*")
    for i in range(len(string)):
        string[i] = str(c(string[i]))
    answer = c("*".join(string))
    return answer
while '(' in countlist:
    for i in range(len(countlist)):
        if countlist[i] == '(':
            head = i-1
        if countlist[i] == ')':
            end = i+1
            break
    count = countlist[head:end]
    sliceCount = count[2:len(count)-1]
    sliceCountList = sliceCount.split(",")
    for i in range(len(sliceCountList)):
        if ("*" in sliceCountList[i]) or ("+" in sliceCountList[i]):
            sliceCountList[i] = counting(sliceCountList[i])
        else:
            sliceCountList[i] = float(sliceCountList[i])
    answer = max(sliceCountList) - min(sliceCountList)
    countlist = countlist.replace(count,str(answer))
print(int(c(countlist)))


看一下題目標題:先加後乘與函數

 

很明顯是要先加法再乘法,並且只有這兩種基本運算

而且最後都要輸出整數,sliceCountList[i] = float(sliceCountList[i])

可以直接用int,過程也不用判斷小數

 

還有ZJ其實有方法繞過eval檢測

 

改過的程式碼