POJ 3332 Parsing Real Numbers

本文详细阐述了一种用于判断实数合法性的算法实现过程,包括状态机设计、输入字符处理及最终判断逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://poj.org/problem?id=3332

题意:给你一个real number , 要求判断是否合法。

思路:第一题DFA。所谓的DFA无非就是一种在各个有限的状态之间转化的图,经过一系列的变化之后问最后一种状态是否合法。

代码:

/*
par=	0: 初始状态
		1: 以 + 或者 - 号  
		2: 以 .结尾 
		3: 以数字结尾, 没出现过小数点 
		4: 以E 或者 e结尾 
		5: 数字后面跟blank 
		6: 有了E,以数字结尾 
		7: 有了E , 以+或者-结尾 
		8: 有了E ,数字后面跟blank 
		9: 以数字结尾, 已经出现过小数点	 
*/
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int T ,N,par;
char ch[1010] ;
char now[1010] ;

void Init(){
	int i , j ,k, len;
	i = 0 ; len = strlen(ch);
	while(i<len && (ch[i ]==' ' || ch[i]==9))	i++ ;
	j = len-1 ;
	while(j>=i &&  (ch[j]==' ' || ch[i]==9))	j-- ;
	for(k=0 ;i<=j;i++,k++){
		now[k] = ch[i] ;
	}	
	now[k] = 0 ;
	N = k ;
}
void judge(char c){
	if(par == 0){
		if(c=='+' || c=='-')	par = 1 ;
		else if(c == '.')	par = -1 ;
		else if( isdigit(c) ) par = 3 ;
		else if( c=='e' || c=='E') par = 4 ;
		else		par = -1 ;
	}
	else if(par == 1){
		if( isdigit(c) )	par = 3 ;
		else par = -1 ;
	}
	else if(par == 2){
		if( isdigit(c) )	par = 9 ;
		else 	par = -1 ;
	}
	else if(par == 3){
		if( isdigit(c) ) par = 3 ;
		else if(c == '.')	par = 2 ;
		else if(c=='+' || c=='-')	par = -1 ;
		else if(c=='e' || c=='E')	par = 4 ;
		else 	par = 5 ;	//空格 
	}
	else if(par == 9){
		if( isdigit(c) )	par = 9 ;
		else if(c=='e' || c=='E')	par = 4 ;
		else if(c==' ' || c==9)	par = 5 ;
		else par = -1 ;
	}
	else if(par == 4){
		if( isdigit(c) )  par = 6 ;
		else if(c=='+' || c=='-')	par = 7 ;
		else par = -1 ;
	}
	else if(par == 5){
		if(c=='e' || c=='E') par = 4 ;
		else if(c==' ' || c==9)	par = 5 ;
		else		par = -1 ;
	}
	else if(par == 6){
		if(isdigit(c)) par = 6 ;
		else if(c==' ' || c==9)	par = 8 ;
		else par = -1 ;
	}
	else if(par == 7) {
		if(isdigit(c))	par = 6 ;
		else par = -1 ;
	}	
	else if(par == 8){
		if(c==' ' || c==9)	par = 8 ;
		else	par = -1 ;
	}
}

void solve(){
	int i,j ;
	par = 0 ;
	bool ok = 1 ;
	for(i=0;i<N;i++){
		judge( now[i] );
		if(par == -1){
			ok = 0 ;	break ;
		}
	}
	if(par==1 || par==2 || par==4 || par==7 || par==-1) 	ok=0 ;
	if(!ok)	printf("ILLEGAL\n");
	else 	printf("LEGAL\n");
}

int main(){
	scanf("%d",&T) ;
	getchar() ;
	while(T--){
		gets(ch) ;
		Init() ;
		solve() ;
	}	
	return 0 ;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值