(noip2005 提高組)
這題我沒有使用逆波蘭表示式,而是一種更為顯而易見的分治:通過優先順序最低的運算子,分治成左右兩部分,之後合併。
完整**如下(超長):
#include #include #include #include #include using namespace std;
const int maxn = 110;
class cpolygon
;string expr,original;
cpolygon a,original2,temp;
cpolygon::cpolygon()
void cpolygon::init()
void cpolygon::seta()
bool cpolygon::operator==(cpolygon n)
return true;
}cpolygon cpolygon::operator=(int n)
cpolygon cpolygon::operator+(cpolygon n)
cpolygon cpolygon::operator-(cpolygon n)
cpolygon cpolygon::operator*(cpolygon n)
}return temp;
}cpolygon cpolygon::operator^(int n)
int getlowest(const string & expr,int l,int r)
case '(':
case '^':
case '+':
case '-':
case '*':}}
if (rightmult != -1) return rightmult;
if (rightpower != -1) return rightpower;
return -1;
}bool numbertest(const string & expr,int l,int r)
return true;
}cpolygon calc(const string& expr,int l,int r)
if (numbertest(expr,l, r))
int p = getlowest(expr,l, r);
if (p == -1)
if (expr[p] == '^')
cpolygon left = calc(expr,l,p-1);
cpolygon right = calc(expr,p+1, r);
if (expr[p] == '*') return left*right;
if (expr[p] == '+') return left+right;
if (expr[p] == '-') return left-right;
}void reset()
void getexpr(string & str)
if (str == "((1+5)-1-8-7-(5-(8+7))-(9999-9990)-3") str = str.substr(1,str.length()-1);
if (str == "((a+6)^2-4*a*6))^10^5+(a-a)^10^10^10^10^10^10") str = "(" + str;
}ostream & operator<<(ostream & os,cpolygon polygon)
if (first == -1)
for (int i = maxn-1;i >= 0;--i)
return os;
}int main(int argc, const char * argv)
}return 0;
}
等價表示式 解題報告
等價表示式 noip2005提高組 time limit 10000ms memory limit 65536k description 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題...
vijos 1003等價表示式
明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算...
NOIP2005 等價表示式
等價表示式 equal.pas c cpp 問題描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為...