找出正确手机号码
题目:已知手机号码是由0-9等组成的11位的字符串,现根据所输入的字符判断其是否为正确的手机号码
要求:1、若输入的字符串开头为151、153、173、180、193任意一组且刚好为11位的数字组成,则输出:%s is ok
2、若输入的字符都是由数字组成且字符个数不足11位,则输出:%s is short
若输入的字符都是由数字组成且字符个数大于11位,则输出:%s is long
3、若输入的字符包含除0-9以外的字符,则输出:illegal
思路:根据所输入的字符进行一个一个判断,此处可以参考形式语言与自动机理论中的自动机思想,画个自动机状态图,根据一个个输入的字符进行下一步判断,满足条件的进行相应情况输出。
1 #include<stdio.h> 2 #include<string.h> 3 #define x0 0 4 #define x1 1 5 #define x2 2 6 #define x3 3 7 #define x4 4 8 #define x5 5 9 #define short 6 10 #define long 7 11 #define ok 8 12 #define illegal 9 13 int FA(int state,char input); 14 int main() 15 { 16 char a[100]; 17 int state,i=0; 18 gets(a); 19 state=x0; 20 while(a[i]!='\0') 21 { 22 state = FA(state,a[i]); 23 i++; 24 } 25 if(i==11 && state==short ) 26 state = ok; 27 else if(i>11 && state==short) 28 state = long; 29 if(state >= 1 && state <= 6) 30 printf("%s is short",a); 31 else if(state == 7) 32 printf("%s is long",a); 33 else if(state == 8) 34 printf("%s is ok",a); 35 else if(state == 9 || state == 0) 36 printf("%s is illegal",a); 37 return 0; 38 } 39 int FA(int state, char input) 40 { 41 switch(state) 42 { 43 case x0: 44 if(input == '1') state=x1; 45 else state=illegal; 46 break; 47 case x1: 48 if(input == '5') state=x2; 49 else if(input == '7') state=x3; 50 else if(input == '8') state=x4; 51 else if(input == '9') state=x5; 52 else state=illegal; 53 break; 54 case x2: 55 if(input == '1' || input == '3') state=short; 56 else state=illegal; 57 break; 58 case x3: 59 if(input == '3') state=short; 60 else state=illegal; 61 break; 62 case x4: 63 if(input == '0') state=short; 64 else state=illegal; 65 break; 66 case x5: 67 if(input == '8') state=short; 68 else state=illegal; 69 break; 70 case short: 71 if(input <= '9' && input >= '0') state=short; 72 else state=illegal; 73 break; 74 } 75 return state; 76 }