NC 16657 暴力 中綴表示式

2021-10-07 13:09:52 字數 1793 閱讀 7871

題意

傳送門 nc 16657

題解驗證表示式的等價性,考慮代入多組素數進行判斷,防止溢位還要模乙個大素數。

對於表示式的求解,先用棧預處理多餘的括號;然後按照操作符的優先順序遞迴求解,操作符優先順序越低的越先處理,這樣保證回溯時滿足操作符越高的越優先計算;對於二元運算子,只記錄出現在括號外的部分,對於單獨的括號表示式再拆括號,以保證括號計算的正確性;相同優先順序的二元運算子先處理出現在表示式最末的,以保證相同優先順序從左到右順序計算。

#include

using

namespace std;

#define mod 1000000007

typedef

long

long ll;

int a, m =

10, rec[10]

;int test[10]

=;string s;

ll qpow

(ll x, ll n)

return res;

}ll number

(int i,

int j)

ll calc

(int i,

int j)}if

(add !=-1

&& s[add]

=='+'

)return

(calc

(i, add -1)

+calc

(add +

1, j)

)% mod;

if(add !=-1

&& s[add]

=='-'

)return

(calc

(i, add -1)

-calc

(add +

1, j)

)% mod;

if(mul !=-1

&& s[mul]

=='*'

)return

(calc

(i, mul -1)

*calc

(mul +

1, j)

)% mod;

if(mul !=-1

&& s[mul]

=='/'

)return

(calc

(i, mul -1)

/calc

(mul +

1, j)

)% mod;

if(pow !=-1

)return

qpow

(calc

(i, pow -1)

,calc

(pow +

1, j));

if(s[i]

=='('

&& s[j]

==')'

)return

calc

(i +

1, j -1)

;return

number

(i, j);}

void

pre()}

while

(!id.

empty()

)}intmain()

int n;

cin >> n;

cin.

get();

for(

int i =

0; i < n; i++)}

if(f) cout <<

char

(i +

'a');}

cout << endl;

return0;

}

中綴表示式

實現 直接計算中綴表示式 不含括號 include include includeusing namespace std 運算符號優先順序比較 加減為低階運算,乘除是高階運算 先算乘除 return 1 means can calculate,else can not.int getpriority...

中綴表示式

輸入乙個中綴表示式 由 0 9組成的運算數 加 減 乘 除 四種運算子 左右小括號組成。注意 也可作為負數的標誌,表示式以 作為結束符 判斷表示式是否合法,如果不合法,請輸出 no 否則請把表示式轉換成字尾形式,再求出字尾表示式的值並輸出。注意 必須用棧操作,不能直接輸出表示式的值。輸入格式 第一行...

中綴表示式 字尾表示式

中綴表示式就是 a b 這樣的,運算子在兩個數的中間 字尾表示式就是 a b 這樣的,運算子在兩個數後面 再細分一下 中綴表示式 字尾表示式 a b c a b c a b c a b c a b c a b c a b c a b c a b c d e a c a b c d e a c emm...