2017sjtu-String to int
理解题意:输入一个字符出啊str,字符串内可能包括空格 数字 字母 ,输出第一个有效数字
思路:因为cin会忽略有效数据前的所有空格、换行符、Tab,因此考虑cin吸收输入字符串开始的几个空格。
在for循环中遍历整个str: 当ans字符串为空时,所有满足1~9的数字都可以加入ans(0不能做最高位)
当ans字符串不空时,所有满足0~9的数字都可以加入ans;且若此时遍历到了非法字符串(非数字),则跳出循环,此时ans中保存的即为第一个合法数字
若ans长度大于10,跳出循环
判断ans是否为空: 若ans为空,则遍历str,查找是否有0:有0则输出0,否则输出-1表示该字符串没有数字
若ans不空,则判断ans是否在INT_MAX的范围内,此时ans合法的情况:ans长度小于10 或ans长度等于10但字典序小于等于"INT_MAX"
#include <iostream>
#include <string>
#include <climits>
using namespace std;
int main()
{ string str;
while(cin>>str)//cin去掉字符串前面的空格
{
string ans;
for(int i=0;i<str.size();i++)
{
if(ans.empty())//如果ans为空,则此时的有效数字不能是0
{
if(str[i]>='1'&&str[i]<='9') ans+=str[i];
}
else//ans不空,有效数字可以是0
if(str[i]>='0'&&str[i]<='9') ans+=str[i];
else break;//ans不空且遇到了非数字的字符,退出循环
if(ans.size()>10) break;//ans的值超出int范围(10位),退出循环
}
if(ans.empty())//未找到非0开头的数字
{
//判断str是否有0
if(str.find('0')==str.npos) cout<<-1<<endl;
else cout<<0<<endl;
}
else if(ans.size()<10||(ans.size()==10&&ans<="2147483647")) cout<<ans<<endl;//若ans长度<10或者ans长度==10但是ans字典序小于等于INT_MAX,输出ans
else cout<<-1<<endl;
}
}