D 表达式求值
题目地址:
基本思路:
这题难点没有什么,就是模拟比较麻烦,注意到我们取后四位也就是说在计算过程中对10000取模就行了,然后处理我这里是先把数字和字符全部独立出来放在两个数组里,然后再开一个数组,对于直接+的我们放在数组中,对于有*(注意会有连乘,因为这个WA了一次)的我们先连续乘出答案再放在数组中,那么最终这个数组里的加起来就是答案了,具体细节可以看代码。
ps.听说这题Python一行就能写QAQ,不会Python的自闭了。
参考代码:
#pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h> using namespace std; #define IO std::ios::sync_with_stdio(false) #define int long long #define rep(i, l, r) for (int i = l; i <= r; i++) #define per(i, l, r) for (int i = l; i >= r; i--) #define mset(s, _) memset(s, _, sizeof(s)) #define pb push_back #define pii pair <int, int> #define mp(a, b) make_pair(a, b) #define INF 0x3f3f3f3f inline int read() { int x = 0, neg = 1; char op = getchar(); while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar(); } while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); } return neg * x; } inline void print(int x) { if (x < 0) { putchar('-'); x = -x; } if (x >= 10) print(x / 10); putchar(x % 10 + '0'); } const int mod = 10000; string str; vector<char> vec; vector<int> digit; int to_digit(string s){//将字符串转化成数字; int sum = 0; for(auto it : s){ sum *= 10; int k = it - '0'; sum += k; } return sum % mod; } signed main() { IO; cin >> str; string temp; for(auto it : str){ if(isdigit(it)) temp += it; else{ digit.push_back(to_digit(temp));//数字单独分出来; temp.clear(); vec.push_back(it);//符号单独分出来; } } digit.push_back(to_digit(temp)); vector<int> res; for(int i = 0 ; i < (int)vec.size(); i++){ int sum = digit[i]; while(vec[i] == '*'){//连乘的全乘完; sum *= digit[i+1]; sum %= mod; i++; } res.push_back(sum); } //最后的地方要单独处理一下; if(vec.empty() || vec.back() == '+') res.push_back(digit.back()); //统计答案; int ans = 0; for(auto it : res){ ans += it; ans %= mod; } cout << ans % mod<< '\n'; return 0; }