時間限制: 1 sec 記憶體限制: 128 mb還沒學資料結構,聽學過的大佬說做法是,開兩個棧,乙個存運算順序,乙個存數字。具體不太清楚。。。。。提交: 61 解決: 27
[提交][狀態][討論版][命題人: 外部匯入]
小明在你的幫助下,破密了ferrari設的密碼門,正要往前走,突然又出現了乙個密碼門,門上有乙個算式,其中只有「(」,「)」,「0-9」,「+」,「-」,「*」,「/」,「^」求出的值就是密碼。小明數學學得不好,還需你幫他的忙。(「/」用整數除法,取商)
輸入共1行,為乙個算式。
輸出共1行,就是密碼。
1+(3+2)*(7^2+6*9)/(2)258100%的資料滿足:算式長度<=30 其中所有資料在2的31次方-1的範圍內。
這一題我的方法是模擬人腦運算,優先尋找(),其次^,然後*/,最後+-。前面的遇到乙個算乙個,然後把式子在字串中抹去,替代為剛剛算出的值,然後迴圈計算,直到沒有數字以外的符號,就可以退出迴圈了。。我大體思路是這樣。下面附上我的**。
#include #include#include#includeusing namespace std;
stacksta;
pair ,pair > f(string& s,int l)
i++;
}if(l-i!=0)
i--;
int start=l-i;
string st=s.substr(start,i);
a=atoi(st.c_str());
i=1;
while(s[l+i]<='9'&&s[l+i]>='0')
st=s.substr(l+1,i-1);
b=atoi(st.c_str());
int en=l+i-1;
pair ,pair > p(make_pair(a,b),make_pair(start,en));
return p;
}int val(string &s)
}for(int i=0;i,pair > p=f(s,i);
int cj=1;
int a=p.first.first,b=p.first.second;
if(s[i]=='+')
cj=a+b;
else
cj=a-b;
s.erase(p.second.first,p.second.second-p.second.first+1);
s.insert(p.second.first,to_string(cj));
i=0;}}
return atoi(s.c_str());
}int main(int argc, char *argv)
else
}i++;
}if(!sta.empty())
else
}
這是我的**。
然後我們來看看大佬的**。。。。
#include#include #include#include#includeusing namespace std;
int mypow(int a,int b)
s[w+1]=')';
s[0]='(';
s[w+2]='\0';
stacknum;
stackop;
for(int i=0;i恩,大佬寫的**比較簡潔。。。雖然我也還沒仔細看。但足以看出大佬與我們的不同。。。
這些**長度都不短,是否又有更快的方法?
有,但是就並非模擬了,考慮一下python的eval
print(eval(input().replace('^','**').replace('/','//')))
一行簡潔明瞭。 字串輸入計算器
一般會在喜歡考字串的筆試中遇到。1.無括號,簡單計算器設定 首先給出python 實現 class solution def calculate self,s str int d 0 sign res 0 for i in range len s if s i 0 d d 10 int s i if...
Python之字串計算(計算器)
import re expression 1 2 60 2 3 40.0 42425 5 9 2 5 3 357 553 3 99 4 2998 10 568 14 4 3 16 3 2 56 56 45 question eval expression print question def ari...
字串應用(計算器)
給定乙個包含正整數 加 減 乘 除 的算數表示式 括號除外 計算其結果。表示式僅包含非負整數,四種運算子和空格。整數除法僅保留整數部分。示例 輸入 3 2 2 輸出 7 答案 思路 1.碰到數字直接入棧 2.碰到空格,直接下一步 3.碰到 碰到 下乙個數字直接入棧 碰到 num入棧 num num ...