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

【题目】

    给定一个字符串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求余。




































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值