題目傳送門html
首先這道題沒有翻譯,這是很奇怪的,通過了(bai)查(du)字(fan)典(yi)以後,你會發現,什麼用都沒有……ios
樓下的 dalao 們給的解釋很是的模糊(果真仍是我太弱了),因而我本身寫一篇題解,來仔仔細細得解釋一下。算法
給出一道算術表達式,按照一個特定的法則來計算這道算術表達式。spa
在手動計算一下以後,你會發現這個運算法則其實就是將運算符的ASCLL碼也當作數字計算了進去。翻譯
大約就是,你須要把這個算術表達式當作字符串讀入,code
按照正常的流程,應該先把這個字符串中的數字和運算符分離開,htm
而後經過對運算符的判斷,一 一把各個位於運算符兩邊的數字按照運算符計算,最後輸出答案。ci
可是這個題是與正常有區別的,字符串
你須要在遇到一個運算符後,也就是在這個運算符以後的數字以前,把這個運算符的ASCLL碼當作這個數字的第一位給計算進去。get
以樣例 3 爲例:
其中,當你把 112 (第一個數字)提取出來以後,下一個字符爲 ‘ - ’(減),‘ - ’ 的ASCLL碼爲 45 ,而把這個減號當作數字來處理的話,那就須要減去字符‘ 0 ’,也就是 48。
因此第二個數字的第一位爲 -3。
按照正常的將各位數字轉化爲一個數字的流程,-3 須要先乘 10 後加上下一位的 3 得 -27 ,而後 -27 乘 10 後加上下一位數字 7。
這樣得出的第二個數字爲 -263。
又由於第二個數字的前面的運算符爲 ‘ - ’(減)
那麼就是第一個數字減去第二個數字:112 - (-263) = 375
這就是最後結果的來由。
最後上代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define LL long long #define F1(i, a, b) for (int i = a; i <= b; ++i) #define F2(i, a, b) for (int i = a; i >= b; --i) // 懶人必備 using namespace std; char s[1001]; // 存儲字符串 int main() { LL l, sum = 0, x = 0, flag = 1; // sum存儲結果,flag存儲正負 cin >> s; l = strlen(s); F1 (i, 0, l - 1) { // 遍歷字符串 if (s[i] < '0' || s[i] > '9') { // 若是當前字符爲運算符 sum += x * flag; // 將運算符前面的數字加上 x = 0; // 爲計算下一個數字,x要清零 if (s[i] == '+') flag = 1; if (s[i] == '-') flag = -1; x = x * 10 + (s[i] - '0'); // 將當前運算符當作數字計算進去 } if (s[i] >= '0' && s[i] <='9') { // 把每一位數字轉化爲一個數字 x *= 10; x += (s[i] - '0'); } } sum += x * flag; // 加上最後一個數字 printf("%lld\n", sum); return 0; }
但願解釋明白了
這種計算方式好像是來源於一個叫作「 brainf**k 」(又叫作BF)的語言。
據說是出題人受此啓發而後出了這麼一個題來做爲 CF 愚人節的 E 題。
這人挺會玩