幼儿园的小朋友们一直在研究一个问题—— 如何在一个长长的句子中找到最大的那个非负整数(不存在负数)。你很不幸的被他们拖住了,又很不幸的被他们叫去执行这个任务,你非常得不爽! 因为你觉得这么简单的问题简直侮辱了你的智商,所以你决定写一个程序来代劳。
输入
输入有多组数据。每组输入一个句子(一定包含数字字符,可能包含空格),长度小于256,占一行
输出
输出对应有多行,每行输出所找出的最大的那个非负整数
样例输入
&&12345aBsdDkjie64skjd5lk 3*2&&0%%%00B58CD000000b a000b0000000c000
样例输出
12345 58 0
题目大意:给出许多字符串,问每个字符串中出现的最大的非负整数是多少
题目分析:本来是在刷水题凑出题数的,结果碰到了这个题,涉及到了一点知识盲区,加上一开始真的不知道该怎么实现比较合适,做出这个题后还算是有点小收获的,就写个博客记录一下吧(也可能是我太水了。。)
首先需要了解的前置知识是getline函数的返回值,和gets函数相似,当遇到EOF时返回一个输入无效的值,即能跳出while循环,遇到回车时会进入循环,因为string类若想读取一整行只能用getline,之前还没遇到过相似的题目,所以算是补充了一下知识点吧
再者就是如何比较字符串中出现数字的大小呢,一开始我是想想写个函数,将其转换为数字然后比较的,但想了一下,发现给出的字符串长达256,连续的数字稍微一长,连longlong都爆掉了,所以肯定是不可行的,去网上看了题解后才知道,原来我们可以直接比较连续数字的长度,长度较长的肯定要比长度较短的要大,毕竟数位摆在那里嘛,若长度相等的话,也可以直接用string类的比较大小来判断,因为string类对于字符的比较是按照字典序排序的,从前往后比较,也正好满足了这个题目的要求,所以我们可以直接用string类储存答案,记得初始化mmax为“0”,并且当遇到非0的数字时再开始记录,这样可以避免出现前导0的情况,以上应该就这么多了,简单实现一下就好了
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#define Pi acos(-1.0)
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const int N=1e4+100;
int main()
{
// freopen("input.txt","r",stdin);
string s;
while(getline(cin,s))
{
string mmax="0";
for(int i=0;i<s.size();i++)
{
if(isdigit(s[i])&&s[i]!='0')
{
string temp;
while(isdigit(s[i]))
{
temp+=s[i++];
}
if(temp.size()>mmax.size()||(temp.size()==mmax.size()&&temp>mmax))
mmax=temp;
}
}
cout<<mmax<<endl;
}
return 0;
}