图灵机UN*2

一、题目

对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。

二、算法构造

 3.算法实现

程序源代码(请写入必要的注释)

#include<stdio.h>
void main()
{
    int a,b,length,k=0,i=0,j=0,m=0;
    int remainder[40],n[40];     //定义了一个remainder数组,用来收集短除法除得的余数,栈倒序输出。
	int choose=1;
   
		printf("请输入该二进制数: ");
		scanf("%d",&a);
		while(a!=0)
		{
			b=a/2;
			k++;
			remainder[k]=a-b*2;
			a=a/2;
		};	
		printf("该十进制对应的二进制数为: ");
		for (i=k;i>=1;i--)                     //栈倒序输出该二进制数
		{	
			printf("%d",remainder[i]);
		}

    	printf("\n");
		printf("扩展后的二进制编码为:");         //扩展后的二进制编码,相邻两个零之间个数
		m=0;
		for(i=k;i>=1;i--)     
		{
			if(remainder[i]==1)
			{			
				if(i==k)
				{	n[m]=0;                          //将扩展后的二进制存入数组中
					m++;
					n[m]=remainder[i];
					m++;
					n[m]=0;
				}
				else
				{
					n[m]=remainder[i];
					m++;
					n[m]=0;
				}
			m++;
			}
				else if(remainder[i]==0)
				{			
					n[m]=remainder[i];
					m++;
				}	
		}
   
		int l[4]={1,1,0};               //给扩展后的二进制加上110,结束标志,扩展后的编码存储在n[m]中
		for(int c=0;c<3;c++)
		{
			n[m++]=l[c];
		}
		length=m+1;
		for (m=0; m<length; m++)      
		{
			if (n[m] == 0 || n[m] == 1)
			{
				printf("%d", n[m]);    
			}
		}

		printf("\n");
		int inner=0;                   //初始内态为0
   
		for(i=0;i<m-1;i++)             //图灵机运算过程并输出
		{
			switch(inner)              //00—>00R;01—>10R;10—>01R;11—>100R;100—>111R;110—>01STOP
			{	
				case 0:
					{if(n[i]==0)
						{
							inner=0;
							n[i]=0;
						}
						else
						{
							inner=1;
							n[i]=0;
							
						}
						break;
					}
				case 1:
					{if(n[i]==0)
						{
							inner=0;
							n[i]=1;
						}
						else
						{
							inner=10;
							n[i]=0;
						}
						break;
					}
				case 10:
					{if(n[i]==0)
						{
						  inner=11;
						  n[i]=1;
						}
						break;
					}
				case 11:
					{if(n[i]=0)
						{
							inner=0;
							n[i]=1;
						}

						break;
					}
			}
					for(j=0;j<m-1;j++)
					{
						printf("%d",n[j]);
					}
				printf("\n");
		
		}

}
  • 调试、测试及运行结果

运行结果:

  • 经验归纳

    通过此次上机更清晰的理解了图灵机的工作过程,刚开始在十进制转换为二进制数数遇到了问题,后来查了一下才写出来的转换,问题更多地出在后面的循环上面,一直不能跳进循环运行结果有错,后来才发现是数据存储和循环条件的问题。以后写循环一定要注意循环条件!!!

添加搜到的一个十进制转换为二进制的函数

#include<stdio.h>
#include<stdlib.h>
//注意必须调用stdlib.h函数库
int main(void){
    int a=1000;
    char str[30];
    itoa(a,str,2);//2即是代表转换为2进制
    printf("%s",str);

    return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值