题目大意: 判断给出的字符串中是否是正确的科学计数法
A+1.5Be+8C,可以是实数或者含有指数的实数,ABC三个部分表示空格,可有可无,正负号可有可无
指数部分只能是整数
解题思路: 建立有穷自动机状态转移表,一共是10种状态
-1表示无法不合法,最终状态为0 2 4 5 8 9五种状态均为合法,其余的都为非法
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 30
char ch1[2070];
int Find[MAX][MAX]={
{1,2,6,0,-1}, // 1 空
{-1,2,6,-1,-1}, // 2 +
{-1,2,6,5,3}, // 3 +1
{-1,4,-1,-1,-1}, // 4 +1.
{-1,4,6,5,-1}, // 5 +1.5
{-1,-1,6,5,-1}, // 6 +1.5__
{7,8,-1,-1,-1}, // 7 +1.5__E
{-1,8,-1,-1,-1}, // 8 +1.5__E+
{-1,8,-1,9,-1}, // 9 +1.5__E+8
{-1,-1,-1,9,-1} //10 +1.5__E+8___
};
bool Solve(int tlen)
{
int i,p=0;
for(i=0;i<tlen;i++)
{
if(ch1[i]=='+'||ch1[i]=='-')
p=Find[p][0];
else if(ch1[i]>='0'&&ch1[i]<='9')
p=Find[p][1];
else if(ch1[i]=='e'||ch1[i]=='E')
p=Find[p][2];
else if(ch1[i]==' ')
p=Find[p][3];
else if(ch1[i]=='.')
p=Find[p][4];
else
return false;
if(p==-1)
return false;
}
if(p==0||p==2||p==4||p==5||p==8||p==9)
return true;
return false;
}
int main()
{
int i,j,tlen,t;
scanf("%d",&t);
gets(ch1);
while(t--)
{
gets(ch1);
tlen=strlen(ch1);
if(Solve(tlen))
printf("LEGAL\n");
else
printf("ILLEGAL\n");
}
return 0;
}