二进制模5
输入一串字符,若是二进制则求其模五的值。
要求: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.。。。等等数字作为状态,只要语法无错误都可。
#include<stdio.h>
#define x0 0
#define x1 1
#define x2 2
#define x3 3
#define x4 4
#define x5 5
#define invalid 6
#define irregular 7
int FA(int state,char input);
int main()
{
char a[10000];
int state,i=0;
gets(a);
state=invalid;
while(a[i]!='\0')
{
state = FA(state,a[i]);
i++;
if (state==invalid)
break;
}
if (state==x0 || state==5)
printf("0\n");
else if (state==x1)
printf("1\n");
else if (state==x2)
printf("2\n");
else if (state==x3)
printf("3\n");
else if (state==x4)
printf("4\n");
else if (state==6)
printf("invalid\n");
else if (state==7 )
printf("irregular\n");
return 0;
}
int FA(int state, char input)
{
switch(state)
{
case invalid:
if(input == '1') state=x1;
else if(input == '0') state=x5;
else state=invalid;
break;
case x0:
if(input == '1') state=x1;
else if(input == '0') state=x0;
break;
case x1:
if(input == '1') state=x3;
else if(input == '0') state=x2;
else state=invalid;
break;
case x2:
if(input == '1') state=x0;
else if(input == '0') state=x4;
else state=invalid;
break;
case x3:
if(input == '1') state=x2;
else if(input == '0') state=x1;
else state=invalid;
break;
case x4:
if(input == '1') state=x4;
else if(input == '0') state=x3;
else state=invalid;
break;
case x5:
if(input == '0' || input == '1') state=irregular;
else state=invalid;
break;
case irregular:
if(input == '0' || input == '1') state=irregular;
else state=invalid;
break;
}
return state;
}
综合所学的自动机思想,用以C语言函数调用可以能把思路理清。