計蒜客 表示式 遞迴

2022-04-04 01:03:58 字數 1650 閱讀 8338

**鏈結 : ** here!

**思路 : **

當傳入乙個字串後, 給字串中的所有運算子標記優先順序等級, 然後選出來優先順序最低的運算子, 因為優先順序最低的運算子一定是最後計算, 因此就可以將乙個表示式拆分成兩個子表示式, 因此這就將大問題轉化為等價的小問題, 遞迴解決即可

這道題目中有變數 $a$ , 那麼這該如何處理呢 ? 我們可以將 $a$ 替換為其他數字, 只要最後計算的結果相同就可以認為兩個表示式是等價的,

注意 :

-冪運算的數值可能非常大, 因此需要進行取模, 這裡的 $mod = 1e9 + 7$, 如果遇到乘法的話很可能超出 $int$ 的範圍, 因此用 $longlong $ 來儲存計算值.

- 選用什麼值來替換 $a$ 也是需要注意的乙個地方.

** :

#include #include #include using namespace std;

#define inf 1e9

typedef long long ll;

const int mod = 1e9 + 7;

ll quick_pow(ll a, ll b)

return ret % mod;

}// [st, ed)

ll cal_num(char *str, int st, int ed, int a)

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

else if (str[i] == '+') cur_priority = priority + 1;

else if (str[i] == '-') cur_priority = priority + 1;

else if (str[i] == '*') cur_priority = priority + 2;

else if (str[i] == '^') cur_priority = priority + 3;

else continue;

++opt_num;

if (cur_priority <= min_priority)

}if (opt_num == 0)

return temp % mod;

}ll ta = cal_num(str, st, min_pos, a);

ll tb = cal_num(str, min_pos + 1, ed, a);

switch (str[min_pos])

return 0;

}#define max_range 5

int main() ;

int n;

char st[100], ed[100][100];

while (scanf("%[^\n]s", st) != eof)

int vis[30] = ; // vis[i] = 0代表成功通過測試

for (int i = 0 ; i < max_range ; ++i) }}

for (int i = 0 ; i < n ; ++i)

printf("\n");

getchar();

}return 0;

}

計蒜客 組合表示式

請考慮乙個被空格分隔的,由1到n的整數組成的遞增數列 1 2 3 n。現在請在數列中插入表示加的 或者表示減 亦或者表示空白的 例如1 2 3就等於1 23 來將每一對數字組合成乙個表示式 第乙個數字前無空格 計算該表示式的結果並判斷其值是否為0。請你寫乙個程式找出所有產生和為零的長度為n的數列。輸...

計蒜客 組合表示式

請考慮乙個被空格分隔的,由1到n的整數組成的遞增數列 1 2 3 n。現在請在數列中插入表示加的 或者表示減 亦或者表示空白的 例如1 2 3就等於1 23 來將每一對數字組合成乙個表示式 第乙個數字前無空格 計算該表示式的結果並判斷其值是否為0。請你寫乙個程式找出所有產生和為零的長度為n的數列。輸...

計蒜客 2019計蒜之道D

題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...