P1054 等價表示式

2022-04-29 20:39:11 字數 2949 閱讀 1792

目錄**實現

等價表示式

給出乙個表示式,求之後給出的與之等價的表示式。

保證每個表示式最多只有乙個變數 \(a\),可能有+,-,*,(,),^運算。

由於只有乙個變數,我們可以將 \(a\) 特殊值化,如果最終結果相同那麼判定兩式等價。

為了減小誤差,我們可以多取幾個值,但是由於有乘方操作所以最好不要太大。

之後就是中綴表示式的計算,我採用的方法是中綴轉字尾再求值,具體方法下文介紹。

有了這個思路就可以開始實現了。

採用cinscanf輸入都會有點問題,因為中間可能有對於空格。

所以這裡採用getchar寫乙個類似快讀函式來輸入。

string read()

return sum;

}

考慮建立乙個符號棧,進行一下操作:

遇到乙個數字或 \(a\) 直接輸出。

遇到左括號,入棧。

遇到右括號,不斷取出棧頂並輸出,直到棧頂為左括號,然後左括號出棧。

遇到運演算法,只要棧頂符號的優先順序不低於新符號,就不斷取出棧頂並輸出。

結束後輸出棧中所有剩餘符號。

但是這個題目毒瘤還有括號不匹配的情況可能會直接導致 re,所以需要特判。

為了方便統計數字,防止類似4+1+2 -> 41+2+導致4,1兩個數字變為41的情況發生,加上.

stackst;

int n=s.length();

string change()//遇到乙個數字或 a 直接輸出。

a+='.';//加點。

if(s[i]=='(') st.push(s[i]);//遇到左括號,入棧。

else if(s[i]==')')

if(st.empty()) return "ppp";//特判。

st.pop();

}//遇到運演算法,只要 棧頂符號的優先順序不低於新符號,就不斷取出棧頂並輸出。

else if(s[i]=='+' || s[i]=='-')

}else if(s[i]=='*' || s[i]=='/')

}else if(s[i]=='^')

}if(s[i]!='(' && s[i]!=')') st.push(s[i]);

}a+='.';//加點。

while(!st.empty()) //結束後輸出棧中所有剩餘符號。

return a;

}

用乙個棧模擬即可,不再贅述。

stacksa;

int count(string a,int aa)//記錄數字。

else if(a[i]=='.') //加點的妙用。

else if(a[i]=='a') sa.push(aa);//給 a 賦特殊值。

else if(a[i]=='+')

else if(a[i]=='-')

else if(a[i]=='*')

else if(a[i]=='/')

else if(a[i]=='^')

}return sa.top();

}

雖然題目中說指數不可能大於 10,但是會有這種情況發生a^10^10^10

所以為了避免溢位,應當採用較小的a值並用long long進行記錄。

前文介紹的很清楚了,其實不需要整塊的**介紹,不過還是扔在這裡吧。

#include#include#include#include#include#include#define n 6000

#define m 1000

#define int long long

using namespace std;

int n,m;

int ans[m],now[m];

string s;

stackst;

stacksa;

string read()

return sum;

}string change()

a+='.';

if(s[i]=='(') st.push(s[i]);

else if(s[i]==')')

if(st.empty()) return "ppp";

st.pop();

}else if(s[i]=='+' || s[i]=='-')

}else if(s[i]=='*' || s[i]=='/')

}else if(s[i]=='^')

}if(s[i]!='(' && s[i]!=')') st.push(s[i]);

}a+='.';

while(!st.empty())

return a;

}int pow(int a,int b)

return sum;

}int count(string a,int aa)

else if(a[i]=='.')

else if(a[i]=='a') sa.push(aa);

else if(a[i]=='+')

else if(a[i]=='-')

else if(a[i]=='*')

else if(a[i]=='/')

else if(a[i]=='^')

}return sa.top();

}void work(bool flag)

return;

}bool cmp()

signed main()

return 0;

}

完結撒❀。

洛谷 P1054 等價表示式

題目描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是...

洛谷P1054等價表示式題解 zhengjun

題目描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是...

洛谷 1054 NOIP2005 等價表示式

明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算...