UVA11954 題解【模擬】
阿新 • • 發佈:2019-01-01
題目大意:
模擬一個二進位制位運算計算器,給定T行二進位制下的操作序列,對於每行操作,輸出計算得到的值。共有兩類操作運算子,一元運算子not(取反),shr(右移),shl(左移),二元運算子and(且),or(或),xor(異或)。一元運算子的運算優先順序高於二元運算子,二元運算子的優先順序一致,需從左到右依次計算。
每次讀入一個數判斷是否還有操作符,把其之前的操作符從後往前運算掉,最後輸出規格化結果(不含前導零)
AC程式碼如下:
- #include <bits/stdc++.h>
- using namespace
- stack<string> ops;
- string formatNumber(string s) {
- while (!s.empty() && *s.begin() == '0')
- s.erase(s.begin());
- if (s.empty())
- s = "0";
- return s;
- }
- void judge(string n) {
- while (!ops.empty()) {
- string op = ops.top();
- ops.pop();
- if (op == "not") {
- n = formatNumber(n);
- for (int i = 0; i < n.size(); ++i)
- n[i] = (n[i] == '0') ? '1' : '0';
- }
- else if (op == "shr") {
- n = formatNumber(n);
- if (!n.empty())
- n.pop_back();
- }
- else if (op == "shl") {
- n = formatNumber(n);
- n.push_back('0');
- }
- else {
- string m = ops.top();
- ops.pop();
- while (m.size() < n.size()) m = "0" + m;
- while (n.size() < m.size()) n = "0" + n;
- if (op == "xor") {
- for (int i = 0; i < n.size(); ++i)
- n[i] = (n[i] == m[i]) ? '0' : '1';
- }
- else if (op == "and") {
- for (int i = 0; i < n.size(); ++i)
- n[i] = (n[i] == '1' && m[i] == '1') ? '1' : '0';
- }
- else {
- for (int i = 0; i < n.size(); ++i)
- n[i] = (n[i] == '1' || m[i] == '1') ? '1' : '0';
- }
- }
- }
- ops.push(n);
- }
- int main() {
- int T;
- scanf("%d", &T);
- string str;
- int cas = 1;
- while (T--) {
- while (!ops.empty())
- ops.pop();
- while (true)
- {
- cin >> str;
- char ch = getchar();
- if (str[0] == '1' || str[0] == '0')
- judge(str); // number
- else
- ops.push(str); // operator
- if (ch == '\n')
- break;
- }
- printf("Case %d: ", cas++);
- cout << formatNumber(ops.top()) << endl;
- }
- return 0;
- }