#18754: a017


justinli (安茲 烏爾 恭)

學校 : 臺北市立西松高級中學
編號 : 93947
來源 : [36.224.150.113]
最後登入時間 :
2024-09-29 13:20:38
a017. 五則運算 | From: [114.44.181.34] | 發表日期 : 2019-08-04 13:51

#include <iostream>
#include <cstring>
#include <cctype>
#include <string>
using namespace std;
int DFS(int,int);
string s;
int main(){
  while(getline(cin,s)){
    int result=DFS(0,s.length());
    cout << result<<endl; 
  } 
}
int DFS(int le,int ri){
  int c=0;
  for(int i=ri-1;i>=le;i--){//後加減,先遞迴 
    if (s[i]==')') c++;    //括弧內部分割      
    if (s[i]=='(') c--;
    if (s[i]=='+' && c==0){ //後加減,先遞迴 
      return DFS(le,i)+DFS(i+1,ri);
    }
    if (s[i]=='-' && c==0){
      return DFS(le,i)-DFS(i+1,ri);
    }  
  }    
  for(int i=ri-1;i>=le;i--){ //先乘除,後遞迴 
    if (s[i]==')') c++;    //括弧內部分割      
    if (s[i]=='(') c--;
    if (s[i]=='*' && c==0){ //先乘除,後遞迴 
      return DFS(le,i)*DFS(i+1,ri);
    }
    if (s[i]=='/' && c==0){
      return DFS(le,i)/DFS(i+1,ri);
    }
    if (s[i]=='%' && c==0){
      return DFS(le,i)%DFS(i+1,ri);
    }         
  }    
  if ((s[le]=='(')&&(s[ri-1]==')')) return DFS(le+1,ri-1);  //去除刮號
  if (s[le]==' ' &&s[ri-1]==' ') return  DFS(le+1,ri-1); //去除左右兩邊空格 
  if (s[le]==' ') return  DFS(le+1,ri); //去除左邊空格 
  if (s[ri-1]==' ') return  DFS(le,ri-1); //去除右邊空格
  int num=0;
  if (isdigit(s[le])&&isdigit(s[ri-1])){//轉成數字 
    for(int i=le;i<ri;i++) num=num*10+s[i]-'0';
    return num;
  }
}
 
#19120: Re:a017


asfhiol (333)

學校 : 國立臺灣大學
編號 : 79337
來源 : [111.254.210.122]
最後登入時間 :
2023-08-01 00:58:49
a017. 五則運算 | From: [140.112.217.247] | 發表日期 : 2019-09-01 13:46

非常感謝這位大大的分享

用Divide and Conquer確實比stack簡潔多了

我已經順利AC囉!

 
ZeroJudge Forum