1127: 第三章:再見,林靜!
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 87 Solved: 21
[Submit][Status][Web Board]
Description
鄭薇的專業是土木工程,理工科的女生原本就是珍稀動物,而且大多數都長得比較抽象。想她鄭微雖然不是什麼絕代美女,跟她漂亮的媽媽相比也有一定差距,但她有一張討喜的圓臉,小巧的尖下巴,大而靈動的眼睛,秀氣挺直的鼻子,尤其是皮膚白皙無瑕——這是媽媽也承認自己年輕的時候也比不上的。因此,根據鄭微自己無數次攬鏡自照的鑑定結果,她絕對稱得上是人見人愛、花見花開的美少女,簡直就是瓊瑤阿姨筆下的女主角。雖然瓊瑤阿姨的小說已經落伍幾個世紀了,但阿姨的審美觀還是歷久彌新的,看她挑中的連續劇女主角一個比一個紅就知道了。就連一向很少夸人的林靜也曾說過鄭微不說話的時候還是相當有迷惑性的,稱得上“靜若處子”。當然,鄭微很自覺地過濾掉了他後半句“動若瘋兔”的評價,完全當做他對她的肯定。如今想起林靜,她的臉上只是微微一笑。
生性豁達的鄭薇,埋藏起自己的愛情,開始過上大學時代的忙碌生活。
土木工程的數學題:給定一些沒有括號的四則運算表達式,求其結果。
Input
輸入數據中含有一些表達式(數量≤1000,長度按含有的運算計,運算符≤30),表達式的運算符只含有加、減、乘、除。表達式中每個數的精度範圍在double型內,表達式中沒有任何其他運算符,沒有括號。
Output
對每個表達式,計算其結果。按科學計數法輸出,精度按6位小數,每個結果應占獨立一行。如果表達式發生除0的情況,則對該表達式直接輸出“DivByZero”。
Sample Input
3+5.0
6-2*7
6-2/0
3+5*6+1
3+5+1*7
1+2-3*4+5/6-4*3*2*1*1+2+3+4+5
Sample Output
8.000000e+00
-8.000000e+00
DivByZero
3.400000e+01
1.500000e+01
-1.816667e+01
HINT
輸出結果請使用printf("%e\n",ans);或者cout<<scientific<<ans<<endl;
Source
【解析】
看了學長寫的代碼。強呀,強呀。
新學了三個新知識點。sstream頭文件中的stringstream類,該類重載了>>運算符,可以將stringstream類的對象讀進各種類型中。
例如 stringstream st; char c; double num1,num2;
st>>num1>>c>>num2; 則可以將st中3+5.0 的3讀入num1,+讀入c , 5.0讀入num2;
另外學到的就是,對容器a,a.back()返回的是容器a末尾元素的一個引用。與a.end()不同的是end()返回的是迭代器。
還有就是goto語句,雖然在大程序中調試容易出bug,但是對算法這樣的小段代碼還是很實用的,再也不用flag維護的滿天飛了。。。。
#include <bits/stdc++.h>
using namespace std;
vector<double> a;
vector<char> op;
int main()
{
string s;
double number;
char c;
while (cin >> s)
{
a.clear();
op.clear();
stringstream st(s);//調用stringstream的構造函數
st >> number;
a.push_back(number);
double k = 0;
while (st >> c >> number)
{
if (c == '*')
a.back() *= number;
else
{
if (c == '/')
{
if (number == 0)
{
printf("DivByZero\n");
goto out;
}
else
a.back() /= number;//返回a尾部的引用
}
else
{
op.push_back(c);
a.push_back(number);
}
}
}
k = a[0];
for (int i = 0; i<op.size(); i++)
{
if (op[i] == '+')
k += a[i + 1];//算加減運算
else
k -= a[i + 1];
}
printf("%e\n", k);
out:;
}
return 0;
}