【HDU1409】【模拟 极端数据特判】Is It a Number 判定给定字符串是否为数类型

来源:互联网 发布:高圆圆长相知乎 编辑:程序博客网 时间:2024/04/29 01:23
#include<stdio.h>#include<string.h>#include<ctype.h>#include<math.h>#include<iostream>#include<string>#include<set>#include<map>#include<vector>#include<queue>#include<bitset>#include<algorithm>#include<time.h>using namespace std;void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}#define MS(x,y) memset(x,y,sizeof(x))#define MC(x,y) memcpy(x,y,sizeof(x))#define MP(x,y) make_pair(x,y)#define ls o<<1#define rs o<<1|1typedef long long LL;typedef unsigned long long UL;typedef unsigned int UI;template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}const int N=0,M=0,Z=1e9+7,ms63=1061109567;int casenum,casei;char s[105];bool check(){bool dot=0;bool E=0;for(int i=0;s[i];i++)if(!isdigit(s[i])){if(s[i]=='E'){if(E)return 0;E=1;//E最多只能出现一次if((i==0)||(!isdigit(s[i-1])&&s[i-1]!='.'))return 0;//E的前面必须为数字if(s[i+1]==0)return 0;//E的后面必须为数字}else if(s[i]=='-'){if(i!=0&&s[i-1]!='E')return 0;//负号只能出现在串首或E之后if(!isdigit(s[i+1])&&s[i+1]!='.')return 0;//负号的后面必须为数字}else if(s[i]=='.'){if(dot||E)return 0;dot=1;//dot只能出现在E前,且最多只能出现一次bool flag=0;if(i&&isdigit(s[i-1]))flag=1;if(isdigit(s[i+1]))flag=1;if(!flag)return 0;//dot的前后至少要有一侧为数字}else return 0;}return 1;}int main(){scanf("%d",&casenum);getchar();for(casei=1;casei<=casenum;casei++){gets(s);puts(check()?"YES":"NO");}return 0;}/*【数据&&trick&&吐槽】其实这道题的数据很好造,一些纯粹的输入就是最好的测试数据input-E.outputNONONOinput.E-00.E-0outputNOYES【题意】给你一行字符串,让你判定这行字符串是否为一个合法的数字。【类型】模拟【分析】一个合法数字的构成字符集包括——数字,小数点,负号,E。其中E最多出现一次,且——E的前方必须是一个除数字外只含有'-'或'.'的合法数类型,设为类型XE的后方必须是一个除数字外只含有'-'的合法数类型,设为类型Y对于'-','-'可以出现在X或Y中,'-'只能是在首位或者之前为'E'对于'.','.'可以出现在X中,'.'只能出现过一次,且'.'前后必须有一侧为数字。这样这道题就AC了。果然模拟题还是考验逻辑思维能力和数据制造能力啊>_<*/

1 0
原创粉丝点击