C语言解决二进制模五的问题

二进制模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语言函数调用可以能把思路理清。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值