【題解】CF952F 2 + 2 != 4

題目傳送門html

首先這道題沒有翻譯,這是很奇怪的,通過了(bai)查(du)字(fan)典(yi)以後,你會發現,什麼用都沒有……ios

樓下的 dalao 們給的解釋很是的模糊(果真仍是我太弱了),因而我本身寫一篇題解,來仔仔細細得解釋一下。算法

進入正題

題目簡義:

給出一道算術表達式,按照一個特定的法則來計算這道算術表達式。spa

題目分析:

在手動計算一下以後,你會發現這個運算法則其實就是將運算符的ASCLL碼也當作數字計算了進去。翻譯

大約就是,你須要把這個算術表達式當作字符串讀入,code

按照正常的流程,應該先把這個字符串中的數字和運算符分離開,htm

而後經過對運算符的判斷,一 一把各個位於運算符兩邊的數字按照運算符計算,最後輸出答案。ci

可是這個題是與正常有區別的,字符串

你須要在遇到一個運算符後,也就是在這個運算符以後的數字以前,把這個運算符的ASCLL碼當作這個數字的第一位給計算進去。get

以樣例 3 爲例:

\[112 - 37 = 375 \]

其中,當你把 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 題。

這人挺會玩

相關文章
相關標籤/搜索