某模拟题
感觉题意什么都不难,就是给你一些语句让你计算那些语句计算的次数
模拟题,写了两个结构体然后用递归搞好像简单了一点?
因为是模拟题,所以一定会有一些坑
坑如下:
OP 0
LOOP 0
BEGIN
OP 1
END
大概就这三个
------------------------------------------我是代码的分割线------------------------------
#include<algorithm>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int tm(string a){
int val = 0;
for(int i=0;i<a.size();i++)
val = val * 10 + a[i]-'0';
return val;
}
struct item{
int t,a;
void init(){
string s;
cin>>s;
if(s=="n")
t = 1,a = 1;
else{
t = 0;
a = tm(s);
}
}
void print(){
if(a == 1 && t == 0){
cout<<"1";
return;
}
if(a != 1){
cout<<a;
if(t) cout<<"*";
}
if(t) cout<<"n";
if(t>1) cout<<"^"<<t;
}
};
item operator * (const item &x,const item & y){
item ret;
ret.t = x.t + y.t,ret.a = x.a * y.a;
return ret;
}
bool cmp(const item &x,const item & y){
return x.t > y.t;
}
struct poly{
vector<item> p;
poly(){
p.clear();
}
void add(item s){
p.push_back(s);
}
void muti(item s){
for(int i=0;i<p.size();i++)
p[i] = p[i] * s;
}
void add(poly m){
for(int i=0;i<m.p.size();i++)
add(m.p[i]);
}
void clean(){
vector<item> d = p;
sort(d.begin(),d.end(),cmp);
p.clear();
for(int i=0;i<d.size();i++){
item & curr = d[i];
if(p.size()== 0 || curr.t != p[p.size()-1].t){
if(curr.a != 0)
p.push_back(curr);
}
else
p[p.size()-1].a += curr.a;
}
}
void out(){
if(p.size()==0){
cout<<0<<endl;
return;
}
for(int i=0;i<p.size();i++){
p[i].print();
if(i<p.size()-1)cout<<"+";
else cout<<endl;
}
}
};
poly calu(){
poly curr;
string next;
while(cin>>next){
if(next=="END")
return curr;
if(next=="OP"){
item adder;
adder.init();
curr.add(adder);
}
if(next=="LOOP"){
item mier ;
mier.init();
poly nexter = calu();
nexter.muti(mier);
curr.add(nexter);
}
}
}
int main(){
int n;
string temp;
int icase = 1;
cin>>n;
while(n--){
if(icase!=1)
cout<<endl;
cin>>temp;
poly ans = calu();
cout<<"Program #"<<icase++<<endl;
cout<<"Runtime = ";
ans.clean();
ans.out();
}
return 0;
}