解题思路:
对于输入串做分析,提取每个增量,然后对增量前面的系数按带符号整数做排序,从小到大,得出计算增量顺序。
用c++string的find方法获取每个"a++"和“++a”的位置为基准,查看前面的系数和符号,构成
vec<系数>,并进行从小到大排序。
注意事项:
递交答案显示答案错误。没有找到原因,对于输入字符串和系数没有做边界检查或过滤?
参考代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> //sort
#include <stdlib.h> //atoi
using namespace std;
struct s_basic{
short n, m;//m=0=>a++, m=>++a
};
//for sort
bool compare(const struct s_basic &t1, const struct s_basic &t2)
{
return t1.n < t2.n;
}
void stringscan( vector<struct s_basic> &v, string s, const char* p, short m)
{
struct s_basic b;
int l = 0, i;
b.m = m;
//parse string to get basic items;
while( (l = s.find(p, l))!= string::npos)
{
if( l == 0)//head is a++ or ++a
{
b.n = 1;
v.push_back(b);
}else
{
switch( s[l-1])
{
case '+':
b.n=1;
break;
case '-':
b.n=-1;
break;
case '*':
i = l - 1;
while( i > 0 && s[i-1] !='+' && s[i-1] != '-')
--i;
b.n=atoi(s.substr(i, l-i-1).c_str());
if(s[i-1]=='-')
b.n=-b.n;
// cout<<" l=" << l << " i=" << i << " b.n="<<b.n<< endl;
break;
}//end of switch
v.push_back(b);
}//end if
l += 3;
}//end of while
}
int main()
{
int a, sum = 0, i;
string s, subs;
vector<struct s_basic> vec;
cin >> a;
cin >> s;
stringscan(vec, s, "a++", 0);
stringscan(vec, s, "++a", 1);
sort(vec.begin(), vec.end(), compare);
for(i = 0; i < vec.size(); ++i)
{
sum += vec[i].n * (a+++vec[i].m);
}
cout << sum << endl;
vec.clear();
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复