1 /*
2 已知语言L={x|x∈{0,1}*}且当把x看成二进制时,x模5与0同余,要求当x为0时,
3 |x|=1,且x!=0时,x的首字符为1。画出该语言的DFA状态图。
4 s为初始状态,a~e分别代表余0~4,z表示第一个输入为0,t表示0之后还有输入
5 num=5N+k
6 num=2(5N+k)+k1
7 */
8 #include<stdio.h>
9 #include<string.h>
10 int main(){
11 char num[1000],k;
12 int i;
13 k='s';
14 gets(num);
15 for( i=0; i < strlen(num); i++){
16 if(num[i] == '0' || num[i] == '1')
17 switch(k){
18 case 's': if(num[i] == '1')
19 k='b';
20 else if(num[i] == '0')
21 k='z';
22 break;
23 case 'b': if(num[i] == '0')
24 k='c';
25 else if(num[i] == '1')
26 k='d';
27 break;
28 case 'c': if(num[i] == '0')
29 k='e';
30 else if(num[i] == '1')
31 k='a';
32 break;
33 case 'd': if(num[i] == '0')
34 k='b';
35 else if(num[i] == '1')
36 k='c';
37 break;
38 case 'e': if(num[i] == '0')
39 k='d';
40 else if(num[i] == '1')
41 k='e';
42 break;
43 case 'a': if(num[i] == '0')
44 k='a';
45 else if(num[i] == '1')
46 k='b';
47 break;
48 case 'z': k='t';
49 break;
50 case 't': k='t';
51 break;
52 default :printf("1111111\n");
53 }
54 else{
55 k='s';
56 break;
57 }
58 }
59 switch(k){
60 case 'a': printf("num能被5整除,余数为:0\n");break;
61 case 'b': printf("num不能被5整除,余数为:1\n");break;
62 case 'c': printf("num不能被5整除,余数为:2\n");break;
63 case 'd': printf("num不能被5整除,余数为:3\n");break;
64 case 'e': printf("num不能被5整除,余数为:4\n");break;
65 case 'z': printf("num为0\n");break;
66 case 't': printf("输入有误不符合:x=0时,|x|=1\n");break;
67 default : printf("输入不符合规定\n");
68 }
69 return 0;
70 }