模拟题,注意输出格式,详细见注释。
#include <iostream>
#include <cstring>
#include <string>
#include <stack>
#include <cctype>
using namespace std;
const int MAXN = 15;
int num[MAXN]; //各次幂的系数
int main()
{
int k;
cin >> k;
for (int Case = 1; Case <= k; Case++)
{
memset(num, 0, sizeof(num));
stack<int> p; //循环层对应的LOOP后是数字还是'n'
stack<int> q; //循环层的系数
int nowCycle = 0; //当前循环层数
int nowN = 0; //n的幂
int nowNum = 1; //当前系数
int opNum; //OP后的数字
char c;
string s;
while (cin >> s)
{
if (s == "BEGIN")
{
++nowCycle;
continue;
}
else if (s == "LOOP")
{
++nowCycle;
while (!isdigit(cin.peek()) && cin.peek() != 'n')
getchar();
if (isdigit(cin.peek())) //LOOP后是数字
{
p.push(0);
cin >> nowNum;
if (!q.empty())
nowNum *= q.top();
q.push(nowNum);
}
else //LOOP后是'n'
{
++nowN;
p.push(1);
q.push(nowNum);
cin >> c;
}
}
else if (s == "OP")
{
cin >> opNum;
if (!q.empty())
num[nowN] += opNum * q.top();
else
num[nowN] += opNum;
}
else if (s == "END")
{
--nowCycle;
if (!p.empty() && p.top() == 1)
--nowN;
if (!p.empty())
p.pop();
if (!q.empty())
q.pop();
if (q.empty())
nowNum = 1;
}
if (nowCycle == 0)
break;
}
//输出
cout << "Program #" << Case << endl;
cout << "Runtime = ";
bool flag = false; //运行时间是否不为0
int i;
for (i = 10; i >= 0; i--) //输出最高次幂部分
{
if (num[i] == 0)
continue;
else if (num[i] == 1)
{
flag = true;
if (i == 0)
cout << num[i];
else if (i == 1)
cout << "n";
else
cout << "n^" << i;
break;
}
else
{
flag = true;
if (i == 0)
cout << num[i];
else if (i == 1)
cout << num[i] << "*n";
else
cout << num[i] << "*n^" << i;
break;
}
}
for (i -= 1; i >= 0; i--) //输出剩余部分
{
if (num[i] == 0)
continue;
else if (num[i] == 1)
{
flag = true;
cout << "+";
if (i == 0)
cout << num[i];
else if (i == 1)
cout << "n";
else
cout << "n^" << i;
}
else
{
flag = true;
cout << "+";
if (i == 0)
cout << num[i];
else if (i == 1)
cout << num[i] << "*n";
else
cout << num[i] << "*n^" << i;
}
}
if (flag == false) //运行时间为0
cout << 0;
cout << endl << endl;
}
return 0;
}
继续加油。