您的位置:首页 > 其它

5.2 字符串中数字子串的求和

2017-04-11 11:15 190 查看
【题目】

    给定一个字符串str,求其中全部数字串所代表的数字之和。

【要求】

    1、忽略小数点字符,例如"A1.3",其中包含两个数字1和3。

    2、如果紧贴数字子串的左侧出现字符'-',当连续出现的数量为奇数时,则数字为负数,连续出现的数量为偶数时,则数字为正数。例如,"A-1BC--12",其中包含数字是-1和12。

【举例】

    str="",返回36;

    str="a-1b--2c--d6e",返回7;

#include <string>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string str;
getline(cin, str);
if (str == "" || str.size() == 0)
{
cout << 0 << endl;
return 0;
}
int count = 0, num = 0, cur = 0;
bool posi = true;
for (int i = 0; i < str.size(); i++)
{
cur = str[i] - '0';
if (cur < 0 || cur>9)
{
count += num;
num = 0;
if (str[i] == '-')
{
if (i - 1>-1 && str[i - 1] == '-')
posi = !posi;
else
posi = false;
}
else
posi = true;
}
else
{
num = num * 10 + (posi ? cur : -cur);
}
}
count += num;
cout << count << endl;
return 0;
}

【知识点】

1、关于数字字符和其ASCII的转换问题,int()就可以将字符转换为其ASCII值,同样char()将可以将值转换为其对应的字符,那么数字+‘0’就可以将数字转换为字符;同样,字符-‘0’就可以将字符转换为对应数字。

2、我做本题的失败之处:

    ①思维太常规,比如完全可以遇到非数字字符再累加,这样就省了一重循环。

    ②关于符号问题,完全可以由一个变量来实时更新,没必要再每次都计算负号的数量再算出负号。

    ③关于连续数字字符计算整数值(例1,2,3-》123)的问题可以很简单,没必要多加一重循环计算(num=num*10+cur).同样,想将数值转换为单个字符(例123-》1,2,3),可以循环用商对10求余。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串