題目鏈接: SCUT 2014
題目大意: 判斷給出的字符串中是否是正確的科學計數法
A+1.5Be+8C,可以是實數或者含有指數的實數,ABC三個部分表示空格,可有可無,正負號可有可無
指數部分只能是整數
解題思路: 建立有窮自動機狀態轉移表,一共是10種狀態
-1表示無法不合法,最終狀態為0 2 4 5 8 9五種狀態均為合法,其余的都為非法
代碼:
#include#include #include #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 ='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; }