【题目链接】http://acm.hdu.edu.cn/showproblem.php?pid=1409
【题目大意】
给定一个串,判断其是否是一个数,会有小数点出现,E出现,或者空格出现等;
【分析】
数的特征:
数据由小数和整数部分组成
小数部分可以是.11 也可以是 . 就是小数点后没有数据。
整数也是一样的,可以是2 也可以是 空
若要用指数表示,则E的前面必须有合法的整数或者小数
E后面必须是整数,开头可以有+-号
几组正确的的数据
111 0123 123.456 0.456E-5 .1 1. 1.E2 .1E2
几组不合法的
E E2 2E 2E0.2 2E.2 1.. ..1
【代码】
/*2011-02-14 09:50:37 Accepted 1409 0MS 232K 1092 B C++ */
#include<stdio.h>
#include<ctype.h>
int Isnum(char *a){
int tmp,i;
for(i=0;a[i]&&isdigit(a[i]);i++);
if(!a[i]) return 1;
else if(a[i]=='.'){
i++;
for(;a[i]&&isdigit(a[i]);i++);
if(!a[i]) return 1;
else if(a[i]=='E'){
i++;
if(a[i]=='+'||a[i]=='-') i++;
tmp=i;
for(;a[i]&&isdigit(a[i]);i++);
if(i==tmp) return 0;
if(!a[i]) return 1;
else return 0;
}
else return 0;
}
else if(a[i]=='E'){
if(i==0) return 0;
i++;
if(a[i]=='+'||a[i]=='-') i++;
tmp=i;
for(;a[i]&&isdigit(a[i]);i++);
if(i==tmp) return 0;
if(!a[i]) return 1;
else return 0;
}
else return 0;
}
int main()
{
int T;
char a[105];
scanf("%d",&T);
getchar();
while(T--)
{
gets(a);
if(Isnum(a)==1) puts("YES");
else puts("NO");
}
}