输入:ab34c57ddo
输出:91
输入:-1ab--2c78
输出:79
说明:奇数个‘-’表示负号,偶数个‘-’表示正号
下面这个思路又麻烦又复杂,还只能实现正号的操作,愚蠢至极,记录一下岂不也快哉~
下面这个方法将字符串遍历一次,将找到连续的数字字符串存放到vector<int> sub中,然后再将所有的sub存放到v中,所以最后v存放的是vector,每个vector存放的是连续的数字的字符串,然后遍历一次将数字字符串转换成数字int型,存放到res容器中最后相加即可。
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
int main() {
string s;
while (cin >> s) {
vector<vector<int>> v;
vector<int> sub;
//将东西压入vector中
for (int i = 0; i < s.length(); ++i) {
if (s[i] >= '0'&&s[i] <= '9') {
sub.push_back(s[i]-'0');
}
else {
v.push_back(sub);
sub.clear();
}
if (sub.size()!=0 && i == s.length() - 1) {//如果这个不为空以及i到了尽头
v.push_back(sub);
sub.clear();
}
}
vector<int> res;
for (int i = 0; i < v.size(); ++i) {
int temp = 0;
int mi = v[i].size()-1;
for (int j = 0; j < v[i].size(); ++j) {
temp += v[i][j] * pow(10,mi);
mi--;
}
res.push_back(temp);
}
int sum = 0;
for (int i = 0; i < res.size(); i++) {
sum += res[i];
}
cout << sum << endl;
}
}
后来呀,上面的代码简直就是弃简求繁的做法,同时还发现出现复数我这个代码就不能正常工作了,他会将负号‘-’当作一个0-9之外的字符,自然不会存放起来,结果如下:
在网上学习之后参考这个连接学习了不少基础知识,直接使用字符串相关的知识就可以实现
一、stoi()
包含着string头文件中,可以直接将一个”98“的字符串变成int类型的98.
回忆字符转换成数字直接c-‘0’即可
二、字符串相加
string s1 = "";
string s2 = "ab"
s1 = s1+s2;// "ab"
这个虽然看起来简单,但是我每次遇到字符串这个事情都没有用[捂脸]
三、字符串中数字字串求和
基本思路:学会字符串的基本操作比如加法操作,将会解决很多其他方法比如上面那个愚蠢的方法。
循环遍历字符串,首先统计‘-’号出现的次数,用cmath中pow实现奇偶为问题,用字符串加法和stoi解决数字字符串变成int的问题
#include<iostream>
#include<string>
#include<map>
#include<cmath>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sign = 0;//记录'-'的次数
string str = "";
int sum = 0;
for (int i = 0; i < s.length(); ++i) {
//掌握一个思路是考虑字符串出现循环的时候使用while建立内循环即可
while (s[i] == '-') {
sign++;
++i;//i++看是否连续存在'-'
}
int flag = 0;
//掌握一个思路是考虑字符串出现循环的时候使用while建立内循环即可
//但是注意建立了内循环之后i已经自增,这次循环之后在大循环还要自增一次的,这样会跳过一个数的,但是不知道这个是不是'-'号,所以设置标志位
while(s[i] >= '0'&&s[i] <= '9') {
str += s[i];//增加数字字串到str中
++i;//在这里i自增,如果符合条件的字符自然会继续添加到str中去
flag = 1;
}
if (flag == 1)
--i;
//跳出这个循环之后肯定已经完成将连续的数字串都添加到str了
if (str != "") {
sum += pow(-1, sign)*stoi(str);
}
str = "";
sign = 0;
}
cout << sum << endl;
}
}
测试结果:
最后总结一点:在字符串中判断是否循环出现连续类型的字符比如数字,可以使用while做内循环,但是应该注意while()内循环中i++了一次,考虑是否需要否则在大循环中还会i++一次跳过一个数,比如上面代码如果去掉后面flag的判断实现--i将会跳过”ab3-1“中的‘-’号,最后输出的结果为4,但是实际我们想要的是2.
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sum = 0;
for (int i = 0; i < s.length(); ++i) {
string temp_str = "";
int sign = 0;
while (s[i] == '-') {
sign++;
++i;
}
while (s[i] >= '0'&&s[i] <= '9') {
temp_str += s[i];
++i;
}
if (temp_str != "") {
sum += pow(-1, sign)*stoi(temp_str);
--i;//为了兼容字母的下一个刚好是'-'
}
}
cout << sum << endl;
}
}
参考连接:https://blog.csdn.net/liugg2016/article/details/82192763