zzuli oj 1729: 汇编语言 (模拟)

题目很简单,就是一道模拟,自己比赛时也写出来了,结果没有考虑到longlong的问题,本来也想到了,结果因为WA的次数太多,最后10分钟的时候没有换,哎还是不自信。

简直服气。竟然只是因为这个。。

思路:通过程序模块化,不要全写在main里面。实现变量的赋值和拷贝函数。

代码如下:

#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
string op[12] = { "AX","BX","CX","DX","AH","BH","CH","DH","AL","BL","CL","DL" };
ll A[15], N;
const ll Mod = 256;
int GetNum(string str) {
    for (int i = 0; i<12; ++i) {
        if (str == op[i])
            return i;
    }
    return -1;
}
void init() {
    memset(A, 0, sizeof(A));
}
void Change(string s, ll v) {
    int num = GetNum(s);
    int l, m, r;
    if (num < 4) {
        l = num, m = num + 4, r = num + 8;
        A[l] = v;
        A[m] = v / Mod;
        A[r] = v % Mod;
    }
    else if (num < 8) {
        l = num - 4, m = num, r = num + 4;
        A[m] = v;
        A[l] = A[m] * Mod + A[r];
    }
    else {
        l = num - 8, m = num - 4, r = num;
        A[r] = v;
        A[l] = A[m] * Mod + A[r];
    }
}

void Copy(string s, string p) {
    int r = GetNum(p);
    ll v = A[r];
    Change(s, v);
}
bool isnum(char ch) {
    if ('0' <= ch && ch <= '9')
        return true;
    return false;
}
ll Transform(string str) {
    int len = (int)str.length();
    char last = str[len - 1];
    ll res = 0;
    if (last == 'B') {
        for (int i = 0; i<len - 1; ++i) {
            ll v = (int)(str[i] - '0');
            res = res * 2 + v;
        }
    }
    else if (last == 'H') {
        for (int i = 0; i<len - 1; ++i) {
            ll v;
            if (isnum((char)str[i]))
                v = (int)(str[i] - '0');
            else {
                if ('A' <= str[i] && str[i] <= 'Z')
                    str[i] += 32;
                v = (int)(str[i] - 'a') + 10;
            }
            res = res * 16 + v;
        }
    }
    else {
        for (int i = 0; i<len; ++i) {
            ll v = (int)(str[i] - '0');
            res = res * 10 + v;
        }
    }
    return res;
}

int main(void) {
    int T;
    cin >> T;
    while (T--) {
        init();
        cin >> N;
        string str, AA, BB;
        for (int i = 1; i <= N; ++i) {
            cin >> str;
            if (str == "MOV") {
                string temp;
                cin >> temp;
                int pos = 0;
                AA.clear(), BB.clear();
                for (pos = 0; pos<temp.length(); ++pos) {
                    if (temp[pos] == ',')
                        break;
                    AA += temp[pos];
                }
                for (pos = pos + 1; pos < temp.length(); ++pos)
                    BB += temp[pos];

                int r = GetNum(BB);
                if (r == -1) {
                    Change(AA, Transform(BB));
                }
                else {
                    Copy(AA, BB);
                }
            }
            else if (str == "ADD") {
                string temp;
                cin >> temp;
                int pos = 0;
                AA.clear(), BB.clear();
                for (pos = 0; pos<temp.length(); ++pos) {
                    if (temp[pos] == ',')
                        break;
                    AA += temp[pos];
                }
                for (pos = pos + 1; pos < temp.length(); ++pos)
                    BB += temp[pos];
                int r = GetNum(BB);
                if (r == -1) {
                    ll v = Transform(BB) + A[GetNum(AA)];
                    Change(AA, v);
                }
                else {
                    ll v = A[GetNum(AA)] + A[GetNum(BB)];
                    Change(AA, v);
                }
            }
            else {
                cin >> BB;
                int pos = GetNum(BB);
                if (pos < 4) {
                    ll v = A[pos];
                    ll res = v * A[0];
                    Change("DX", res / (Mod*Mod));
                    Change("AX", res % (Mod*Mod));
                }
                else {
                    ll v = A[pos];
                    ll res = v * A[8];
                    Change("AX", res);
                }
            }
        }
        for (int i = 0; i<4; ++i) {
            cout << A[i];
            if (i != 3)
                cout << " ";
            else
                cout << endl;
        }
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhao5502169/article/details/80025699