简单模拟题,主要就是“地址”,“地址的地址”,“地址里的数据”这几个概念别搞乱脑子就好。C/C++老手应该闭着眼睛也能写出正确的程序来:)
#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <limits>
#include <utility>
#ifndef ONLINE_JUDGE
#include <fstream>
std::ifstream cin("in.txt");
std::ofstream cout("out.txt");
// std::ofstream cout(stdout);
#else
#include <iostream>
#endif
typedef long long llong;
typedef unsigned long long ullong;
typedef long double ldouble;
using namespace std;
#define MAX_MEM 1001
#define MAX_REG 11
char memx[MAX_MEM][4];
int regx[MAX_REG];
int getMem(int i)
{
return (memx[i][0] * 10 + memx[i][1]) * 10 + memx[i][2];
}
void setMem(int i, int value)
{
memx[i][0] = value / 100;
value %= 100;
memx[i][1] = value / 10;
memx[i][2] = value % 10;
}
void Run()
{
char skip[1024];
int ip = 0;
memset(memx, 0, sizeof(memx));
memset(regx, 0, sizeof(regx));
for(; !cin.eof(); ++ip)
{
cin>> memx[ip];
memx[ip][0] -= '0';
memx[ip][1] -= '0';
memx[ip][2] -= '0';
cin.getline(skip, 1024);
char next = cin.peek();
if(next < '0' || next > '9')
break;
}
int maxIP = ip;
int nRunLines = 0;
char* ins;
for(ip = 0;
{
ins = memx[ip];
++nRunLines;
++ip;
switch(ins[0])
{
case 1:
break;
case 2:
regx[ins[1]] = ins[2];
break;
case 3:
regx[ins[1]] = (regx[ins[1]] + ins[2]) % 1000;
break;
case 4:
regx[ins[1]] = (regx[ins[1]] * ins[2]) % 1000;
break;
case 5:
regx[ins[1]] = regx[ins[2]];
break;
case 6:
regx[ins[1]] = (regx[ins[1]] + regx[ins[2]]) % 1000;
break;
case 7:
regx[ins[1]] = (regx[ins[1]] * regx[ins[2]]) % 1000;
break;
case 8:
regx[ins[1]] = getMem(regx[ins[2]]);
break;
case 9:
setMem(regx[ins[2]], regx[ins[1]]);
break;
case 0:
if(regx[ins[2]] != 0)
ip = regx[ins[1]];
break;
}
if(ins[0] == 1)
break;
}
cout<< nRunLines<< '/n';
}
int main(int argc, char* argv[])
{
int n;
cin>> n;
for(int i = 0; i < n; ++i)
{
if(i > 0)
cout<< '/n';
Run();
}
return 0;
}