首页 > 代码库 > HDU - 3347 Calculate the expression — 模拟 + map存变量

HDU - 3347 Calculate the expression — 模拟 + map存变量

  传送门

 

  题意:从输入开始,1.输入样例数;2.然后输入一组样例中的行数n;3.前n-1行为定义变量(之间使用空格隔开),只需要map存进去就可以了(这里有覆盖的情况,故使用mp["s"] = "***"的方法赋值,因为insert的方法如果里面存在的话,插不进入数值);4.然后就是最后一行输入计算式子(之间使用空格隔开)。

  思路:我使用的字符流的方法分割的的字符串,因为题中说了使用空格隔开的;

    变量的储存使用map就可以,在最后一行输入计算式子之后,同样使用字符流分割的方法,分割出来,判断是加法减法变量、数 字(正负)。   我做的时候就是以为都是加法,所以WA了一次。

 

技术分享
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <sstream>
 4 #include <string>
 5 #include <vector>
 6 #include <queue>
 7 #include <map>
 8 
 9 #include <cstdio>
10 #include <cstring>
11 #include <cmath>
12 using namespace std;
13 
14 // 讲字符串转换为数字(这里的函数名起得不合适)
15 long long asksum(string str, int s) {
16     int len = str.length();
17     long long sum = 0;
18     for (int i = s; i < len; ++i) {
19         sum = sum*10+(str[i]-0);
20         // cout << "qwe" << endl;
21     }
22     // cout << sum << "+++++" << endl;
23     if (s)
24         return sum*-1;
25     return sum;
26 }
27 
28 int main() {
29     // ios::sync_with_stdio(false);
30     // cin.tie(NULL);
31     // cout.tie(NULL);
32     
33     int t, n;
34     string str, s;
35     map<string, int> mp;
36     // 储存变量
37     cin >> t;
38     while (t--) {
39         cin >> n;
40         getchar();
41         mp.clear();
42         // 每一次清空上一次残留的变量
43         long long sum = 0;
44         for (int i = 0; i < n; ++i) {
45             getline(cin, str);
46             if (i == n-1) {    // 在输入计算式的时候直接出结果,也可以讲变量和计算式分开
47                 int flag = 1;
48                 // 这个flag就是用来标记是加法还是减法的。
49                 stringstream ss(str);
50                 while (ss >> s) {
51                     if (s[0] >= 0 && s[0] <= 9) {
52                         sum += asksum(s, 0)*flag;
53                         // cout << "+" << endl;
54                     } else if (s[0] == - && s[1] >= 0 && s[1] <= 9){
55                         sum += asksum(s, 1)*flag;
56                         // cout << "-" << endl;
57                     } else if (s == "+") {
58                         flag = 1;
59                     } else if (s == "-") {
60                         flag = -1;
61                     } else if (s[0] >= a && s[0] <= z) {
62                         sum += mp[s]*flag;
63                     }
64                 }
65             } else {
66                 stringstream ss(str);
67                 string var;
68                 int num = 0, zhi;
69                 while (ss >> s) {
70                     num++;
71                     // 因为变量赋值只有三部分,所以这里只需要去第一次和第三次即可
72                     if (num == 1) {
73                         var = s;
74                     } else if (num == 3) {
75                         if (s[0] == -)
76                             zhi = asksum(s, 1);
77                         else
78                             zhi = asksum(s, 0);
79                     }
80                 }
81                 mp[var] = zhi;
82             }
83             // cout << mp.size() << " = size" << endl;
84         }
85         // cout << "sum = " << sum << endl;
86         cout << sum << endl;
87     }
88     
89     return 0;
90 }
hdu 3347

 

  关于字符串分流的知识点:字符串分割

HDU - 3347 Calculate the expression — 模拟 + map存变量