UVA 327

来源:互联网 发布:滴滴面试经验 java 编辑:程序博客网 时间:2024/06/03 13:11

题目大意:输入26个字母(小写)以及++,--,+,-的运算符,求运算的结果,以及按字典次序各字母的值(初值为1~26)题目代码长。。。直接百度,大概看了一下就是运算,杠。

解题思路:先用字符串a,接受运算的式子,因为式子可能有空格,所以用getline,然后用字符串b接受a去空格以后的式子,同时,将式子中有的字母与初值,作为键和值存入map。然后对b字符串遍历,如果字母前有++或--(前增前减),就改变字母的值。由于后增后减是运算后进行,所以暂时不做改变。然后第三个字符串c,存入b字符串去了++,--(无论前增前减还是后增后减)。剩下字母以及+,-,就直接进行运算。最后对b遍历,考虑后增后减,改变字母值,按格式输出就可以了。

ac代码:(不改了,虽然又臭又长)

#include <iostream>#include <map>using namespace std;string a, b, c;int len, add, inc, sum;map <char, int>m;map <char, int>::iterator it;int add_inc(int i){int judge=0;if (i>=2){if (b[i-2] == '-' && b[i-1] == '-')judge--;if (b[i-2] == '+' && b[i-1] == '+')judge++;}return judge;}void count(){int temp = c.size();for (int i=0; i<temp; i++){if (isalpha(c[i])){if (i==0 || c[i-1] == '+')sum += m[ c[i] ];else if (c[i-1] == '-')sum = sum - m[ c[i] ];}}}int main(){while (getline(cin, a)){len = a.size();b = c = "";add = inc = sum = 0;for (int i=0; i<len; i++)if (a[i] != ' ')b += a[i];len = b.size();for (int i=0; i<len; i++)if (isalpha(b[i])){if (!m.count(b[i]))m[ b[i] ] = b[i] - 'a' + 1; m[ b[i] ] += add_inc(i);}for (int i=0; i<len; i++){if (b[i]== b[i+1]){i ++;continue;}c += b[i];}count();for (int i=0; i<len; i++)if (isalpha(b[i]) && i<=len-3){if (b[i+2] == '-' && b[i+1] == '-')m[ b[i] ]--;if (b[i+2] == '+' && b[i+1] == '+')m[ b[i] ]++;}cout << "Expression: " << a << endl;printf("    value = %d\n", sum);for (it=m.begin(); it!=m.end(); it++)printf("%5c = %d\n", it->first, it->second);m.clear();}return 0;}
原创粉丝点击