解题思路:
对于输入串做分析,提取每个增量,然后对增量前面的系数按带符号整数做排序,从小到大,得出计算增量顺序。
用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分
3 人评分
C语言训练-素数问题 (C语言代码)浏览:1654 |
哥德巴赫曾猜测 (C语言代码)浏览:994 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:633 |
【蟠桃记】 (C语言代码)浏览:664 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:879 |
简单的a+b (C语言代码)浏览:573 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:901 |
文科生的悲哀 (C语言代码)浏览:1398 |
小九九 (C语言描述,不看要求真坑爹)浏览:984 |
格式化数据输出 (C语言代码)浏览:811 |