USETCOJ1914数据大搜索

问题重述
一行字符串可能含有多个正整数, 请找出这些整数, 并输出它们的和.
Standard Input
有多组测试数据. 输入的第一行是整数T(1<=T<=100), 表示随后测试数据的组数. 每组测试数据占一行, 由一个可能含有空格的字符串构成, 该字符串可能含有多个数字子串, 每个数字子串的数字个数不超过16, 数字子串的个数不超过10, 字符串的长度不超过1000.
Standard Output
对应每组测试数据, 输出该字符串所包含整数的和. 如果该字符串没有包含数字, 请输出0.
在这里插入图片描述
解题思路
读入字符串string,一一遍历字符串的每一位,并再内嵌一个循环while,如果某一位是数字,那么检测下一位是不是数字,如果也是数字,则用num=num*10+s[i]-‘0’来表示组成的新数,以此类推。定义一个bool值flag,存在这样的数则flag=1,将这样的数存入一个数组中,记得将(flag=0&&num=0)初始化,再继续循环…
陷阱
1、读入的string中有空格!不可以简单地用cin>>s读入,我选择用的getline(cin,s)读入
2、由于在循环外部用cin读入了T,后面接的是读入string,所以输入T后的换行符’\n’被读进第一个字符串,导致输出的第一组总是0!(占位了),所以一定要在cin>>T后先读一次string再进循环
3、每个数字子串的数字个数不超过16,如果数字的位数已经到16了,那么肯定超出了int的范围(int:-2147483648~+2147483647),这时开long long才满足要求!(三个地方:long long a[N],long long num,long long sum)由于数字子串的个数不超过10,所以存储数字子串的字符串不需要开太大了
代码如下:

#include<bits/stdc++.h>
#define N 11
using namespace std;
int main(){
	string s;
	int T;
	long long a[N];//注意了!
	cin>>T;
	getline(cin,s);//注意了!
	while(T--){
		getline(cin,s);
		int i,j=0;
		long long num=0;//注意了!
		bool flag=0;
		for(i=0;i<s.length();i++){
			while((s[i]>='0')&&(s[i]<='9')&&(i<s.length())){//核心循环
				num=10*num+int(s[i])-int('0');//核心算法
				i++;
				flag=1;
			}
			if(flag==1){
				a[j]=num;
				j++;
				flag=0;
				num=0;
			}
		}	
		int k=0;
		long long sum=0;//注意了!
		while(k<j){
			//cout<<a[k]<<" ";
			sum+=a[k];
			k++;
		}
		cout<<sum<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.zwX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值