题目链接: SCUT 2014
题目大意: 判断给出的字符串中是否是正确的科学计数法
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; }
SCUT 2014 B题 Numbers (DFA有穷自动机)
时间: 2024-10-12 20:02:38