**鏈結 : ** 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的限制我們應當怎麼做?我們以樣例為例子...