• UVA11954 题解【模拟】


    题目链接

    题目大意:

    模拟一个二进制位运算计算器,给定T行二进制下的操作序列,对于每行操作,输出计算得到的值。共有两类操作运算符,一元运算符not(取反),shr(右移),shl(左移),二元运算符and(且),or(或),xor(异或)。一元运算符的运算优先级高于二元运算符,二元运算符的优先级一致,需从左到右依次计算。

    每次读入一个数判断是否还有操作符,把其之前的操作符从后往前运算掉,最后输出规格化结果(不含前导零)

    AC代码如下:

    1. #include <bits/stdc++.h>  
    2. using namespace std;  
    3. stack<string> ops;  
    4. string formatNumber(string s) {  
    5.     while (!s.empty() && *s.begin() == '0')  
    6.         s.erase(s.begin());  
    7.     if (s.empty())  
    8.         s = "0";  
    9.     return s;  
    10. }  
    11. void judge(string n) {  
    12.     while (!ops.empty()) {  
    13.         string op = ops.top();  
    14.         ops.pop();  
    15.         if (op == "not") {  
    16.             n = formatNumber(n);  
    17.             for (int i = 0; i < n.size(); ++i)  
    18.                 n[i] = (n[i] == '0') ? '1' : '0';  
    19.         }  
    20.         else if (op == "shr") {  
    21.             n = formatNumber(n);  
    22.             if (!n.empty())  
    23.                 n.pop_back();  
    24.         }  
    25.         else if (op == "shl") {  
    26.             n = formatNumber(n);  
    27.             n.push_back('0');  
    28.         }  
    29.         else {  
    30.             string m = ops.top();  
    31.             ops.pop();  
    32.             while (m.size() < n.size()) m = "0" + m;  
    33.             while (n.size() < m.size()) n = "0" + n;  
    34.             if (op == "xor") {  
    35.                 for (int i = 0; i < n.size(); ++i)  
    36.                     n[i] = (n[i] == m[i]) ? '0' : '1';  
    37.             }  
    38.             else if (op == "and") {  
    39.                 for (int i = 0; i < n.size(); ++i)  
    40.                     n[i] = (n[i] == '1' && m[i] == '1') ? '1' : '0';  
    41.             }  
    42.             else {  
    43.                 for (int i = 0; i < n.size(); ++i)  
    44.                     n[i] = (n[i] == '1' || m[i] == '1') ? '1' : '0';  
    45.             }  
    46.         }  
    47.     }  
    48.     ops.push(n);  
    49. }  
    50. int main() {  
    51.     int T;  
    52.     scanf("%d", &T);  
    53.     string str;  
    54.     int cas = 1;  
    55.     while (T--) {  
    56.         while (!ops.empty())  
    57.             ops.pop();  
    58.         while (true)  
    59.         {  
    60.             cin >> str;  
    61.             char ch = getchar();  
    62.             if (str[0] == '1' || str[0] == '0')  
    63.                 judge(str); // number  
    64.             else  
    65.                 ops.push(str); // operator  
    66.             if (ch == ' ')  
    67.                 break;  
    68.         }  
    69.         printf("Case %d: ", cas++);  
    70.         cout << formatNumber(ops.top()) << endl;  
    71.     }  
    72.     return 0;  
    73. }  

  • 相关阅读:
    Android课程---Activity的跳转与传值(转自网上)
    Android课程---Activity中保存和恢复用户状态
    Android课程---Activity 的生命周期
    Android课程---Activity的创建
    初学JAVA随记——练习写代码(8种数据类型)
    资料——UTF-8
    资料——ASCII码
    初学JAVA随记——8bit(1byte)的取值范围是+127到—128
    初学JAVA随记——变量与常量
    进制转换
  • 原文地址:https://www.cnblogs.com/ZKin/p/9471048.html
Copyright © 2020-2023  润新知