程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> SCUT 2014 B題 Numbers (DFA有窮自動機)

SCUT 2014 B題 Numbers (DFA有窮自動機)

編輯:C++入門知識

題目鏈接: 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;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved