这题本来可能一次性就AC掉的,可惜第二个减号忘打进去了,自己又测各种数据,就是没测减号的数据。Orz。。
#include<stdio.h>
#include<string.h>
char c[1000],s[1000],len,state;
void init()
{
int i,j,tot=0;
for(i=0;i<strlen(c);i++)
if(c[i]!=' ')break;
for(j=strlen(c)-1;j>=0;j--)
if(c[j]!=' ')break;
while(i<=j)
s[tot++]=c[i++];
len=tot;
}
bool dig(int i)
{
if(s[i]>='0'&&s[i]<='9')
return true;
else return false;
}
bool judge(int i)
{
if(state==0)
{
if(s[i]=='+'||s[i]=='-')
state=1;
else if(dig(i))
state=2;
else if(s[i]=='e'||s[i]=='E')
state=5;
else return false;
}
else if(state==1)
{
if(dig(i))
state=2;
else return false;
}
else if(state==2)
{
if(s[i]=='.')
state=3;
else if(s[i]=='e'||s[i]=='E')
state=5;
else if(dig(i))
state=2;
else return false;
}
else if(state==3)
{
if(dig(i))
state=4;
else return false;
}
else if(state==4)
{
if(dig(i))
state=4;
else if(s[i]=='e'||s[i]=='E')
state=5;
else return false;
}
else if(state==5)
{
if(s[i]=='+'||s[i]=='-')
state=6;
else if(dig(i))
state=7;
else return false;
}
else if(state==6)
{
if(dig(i))
state=7;
else return false;
}
else if(state==7)
{
if(dig(i))
state=7;
else return false;
}
return true;
}
void solve()
{
state=0;
init();
for(int i=0;i<len;i++)
{
if(!judge(i))
{
printf("ILLEGAL\n");
return;
}
}
if(state==1||state==3||state==5||state==6)
printf("ILLEGAL\n");
else printf("LEGAL\n");
}
int main()
{
int T;
scanf("%d",&T);
getchar();
while(T--)
{
gets(c);
solve();
}
return 0;
}
下面附带把COJ的Parsing Real Numbers给贴出来,有点小不一样。
这道题要注意只要小数点左右只要一边有数即可,且需要coefficient。
#include<stdio.h>
#include<string.h>
char s[1000],len,state;
bool dig(int i)
{
if(s[i]>='0'&&s[i]<='9')
return true;
else return false;
}
bool judge(int i)
{
if(state==0)
{
if(s[i]=='+'||s[i]=='-')
state=1;
else if(dig(i))
state=2;
else if(s[i]=='.')
state=8;
else return false;
}
else if(state==1)
{
if(dig(i))
state=2;
else if(s[i]=='.')
state=8;
else return false;
}
else if(state==2)
{
if(s[i]=='.')
state=3;
else if(s[i]=='e'||s[i]=='E')
state=5;
else if(dig(i))
state=2;
else return false;
}
else if(state==3)
{
if(dig(i))
state=4;
else if(s[i]=='e'||s[i]=='E')
state=5;
else return false;
}
else if(state==4)
{
if(dig(i))
state=4;
else if(s[i]=='e'||s[i]=='E')
state=5;
else return false;
}
else if(state==5)
{
if(s[i]=='+'||s[i]=='-')
state=6;
else if(dig(i))
state=7;
else return false;
}
else if(state==6)
{
if(dig(i))
state=7;
else return false;
}
else if(state==7)
{
if(dig(i))
state=7;
else return false;
}
else if(state==8)
if(dig(i))
state=4;
else return false;
return true;
}
void solve()
{
state=0;
for(int i=0;i<len;i++)
{
if(!judge(i))
{
printf("NO\n");
return;
}
}
if(state==1||state==5||state==6||state==8)
printf("NO\n");
else printf("YES\n");
}
int main()
{
freopen("t.txt","r",stdin);
int T;
scanf("%d",&T);
getchar();
while(T--)
{
gets(s);
len=strlen(s);
solve();
}
return 0;
}