输入一串字符,若是二进制则求其模五的值。
要求:1、若输入的字符包含除0、1以外的值,则输出:invalid
2、若输入的为二进制字符串,则输出所计算的其模五的值
3、若其输入字符均为0、1,但是第一个输入的字符为0则输出:irregular
思路:可以参照所学的形式语言与自动机理论里面的自动机思想来做题:通过对输入的字符进行一个个的判断,从而输出所求的值,根据相应的状态再进行输出。
根据题意可以判断出非0、1外的输入都是invalid,所以可以根据这个特点设定它的开始状态state=invalid,后面根据输入字符判断,建议在做题目前可以先画自动机状态图,这样有助于理清思路,避免写的时候出现思绪混乱。另外值得注意的是输入的字符串可能一开始是0、1组成,后面就是其他字符再加0、1组成的字符串的情况,这个时候是invalid状态,若像我这样写的就一定要注意跳到break了,不然会导致判断错误,所以一定要注意到这个情况。
这个题也可以用if...else if...else...等语句嵌套,也可以不用宏定义每个状态值,直接用1、2、3、4.。。。等等数字作为状态,只要语法无错误都可。
1 #include<stdio.h> 2 #define x0 0 3 #define x1 1 4 #define x2 2 5 #define x3 3 6 #define x4 4 7 #define x5 5 8 #define invalid 6 9 #define irregular 7 10 int FA(int state,char input); 11 int main() 12 { 13 char a[10000]; 14 int state,i=0; 15 gets(a); 16 state=invalid; 17 while(a[i]!='\0') 18 { 19 state = FA(state,a[i]); 20 i++; 21 if (state==invalid) 22 break; 23 } 24 if (state==x0 || state==5) 25 printf("0\n"); 26 else if (state==x1) 27 printf("1\n"); 28 else if (state==x2) 29 printf("2\n"); 30 else if (state==x3) 31 printf("3\n"); 32 else if (state==x4) 33 printf("4\n"); 34 else if (state==6) 35 printf("invalid\n"); 36 else if (state==7 ) 37 printf("irregular\n"); 38 return 0; 39 } 40 int FA(int state, char input) 41 { 42 switch(state) 43 { 44 case invalid: 45 if(input == '1') state=x1; 46 else if(input == '0') state=x5; 47 else state=invalid; 48 break; 49 case x0: 50 if(input == '1') state=x1; 51 else if(input == '0') state=x0; 52 break; 53 case x1: 54 if(input == '1') state=x3; 55 else if(input == '0') state=x2; 56 else state=invalid; 57 break; 58 case x2: 59 if(input == '1') state=x0; 60 else if(input == '0') state=x4; 61 else state=invalid; 62 break; 63 case x3: 64 if(input == '1') state=x2; 65 else if(input == '0') state=x1; 66 else state=invalid; 67 break; 68 case x4: 69 if(input == '1') state=x4; 70 else if(input == '0') state=x3; 71 else state=invalid; 72 break; 73 case x5: 74 if(input == '0' || input == '1') state=irregular; 75 else state=invalid; 76 break; 77 case irregular: 78 if(input == '0' || input == '1') state=irregular; 79 else state=invalid; 80 break; 81 } 82 return state; 83 }