图灵机

本文介绍了一个简单的图灵机模拟程序,该程序能够将输入的十进制数转换为二进制,并通过特定规则进行处理,最终输出转换后的十进制结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include<stdio.h>
#include<math.h>
#define N 100
typedef struct {
 int data[N];
 int length; 
}Data;
int main()
{
 Data A,B;  //二进制数组,XN×2数组
 int y=0,i=0,x,c[2];//存放内态和输入值
 int sum=0;
 A.length=0;
 B.length=0;
 printf("*****输入一个十进制的数*****\n");
 scanf("%d",&x);
 while(x!=0){
  y=x%2;
  B.data[i]=y;
  i++;
  x=x/2;
  B.length++;
 }
 i--;
 printf("转化为二进制:");
 for(;i>=0;--i){
  A.data[A.length++]=B.data[i];
 }
 //输出二进制数
 for(i=0;i<A.length;i++){
  printf("%d",A.data[i]);
 }
 printf("\n");
 //扩展二进制
 B.length=0;
 for(i=0;i<A.length;i++){
  if(A.data[i]==1){
   B.data[B.length++]=0;
   B.data[B.length++]=1;
  }else if(A.data[i]==0){
   B.data[B.length++]=0;
  }
 }
 B.data[B.length++]=0;
 B.data[B.length++]=1;
 B.data[B.length++]=1;
 B.data[B.length++]=0;
 
 //转换二进制数输出
 printf("扩展后二进制输出为:\n");
 for(i=0;i<B.length;i++){
  printf("%d",B.data[i]);
 }
 printf("\n");
 c[0]=0;
 //图灵机执行命令,开始遍历
 for(i=0;i<B.length;i++){
  c[1]=B.data[i];
  if(c[0]==0&&c[1]==0){
   c[0]=0;
   B.data[i]=0;
   printf("执行命令结果为:%d\n",B.data[i]);
  }
  else if(c[0]==0&&c[1]==1){
   c[0]=1;
   B.data[i]=0;
   printf("执行命令结果为:%d\n",B.data[i]);
  }
  else if(c[0]==1&&c[1]==0){
   c[0]=0;
   B.data[i]=1;
   printf("执行命令结果为:%d\n",B.data[i]);
  }
  else if(c[0]==1&&c[1]==1){
   c[0]=10;
   B.data[i]=0;
  }
  else if(c[0]==10&&c[1]==0){
   c[0]=11;
   B.data[i]=1;
   printf("执行命令结果为:%d\n",B.data[i]);
  }
  else if(c[0]==11&&c[1]==0){
   c[0]=0;
   B.data[i]=1;
   printf("执行命令结果为:%d\n",B.data[i]);
  }
  if(c[0]==11&&c[1]==0){
   break;
  }
 }
 //遍历结束,不满足停止条件,补0继续
 while(c[0]!=11&&c[1]!=0){
  B.data[B.length]=0;
  c[1]=B.data[B.length];
  B.length++;
   if(c[0]==0&&c[1]==0){
   c[0]=0;
   B.data[i]=0;                      
  }else if(c[0]==0&&c[1]==1){
   c[0]=1;
   B.data[i]=0;
  }
  else if(c[0]==1&&c[1]==0){
   c[0]=0;
   B.data[i]=1;
  }else if(c[0]==1&&c[1]==1){
   c[0]=10;
   B.data[i]=0;
  }else if(c[0]==10&&c[1]==0){
   c[0]=11;
   B.data[i]=0;
  }else if(c[0]==11&&c[1]==0){
   c[0]=0;
   B.data[i]=1;
  }
 }
 //满足停止条件,将该位置变1,再加0
 B.data[B.length++]=1;
 B.data[B.length++]=0;
 printf("图灵机计算结果为:");
 for(i=0;i<B.length;i++){
  printf("%d",B.data[i]);
 }
 printf("\n");
 //转换为二进制
 A.length=0;
 for(i=0;i<=B.length-3;i++){
  if(B.data[i]==0&&B.data[i+1]==1&&B.data[i+2]==0){
   A.data[A.length++]=1;
  }else if(B.data[i]==0&&B.data[i+1]==0){
   A.data[A.length++]=0;
  }
 }
 i=0;
 while(A.data[i]==0){
  i++;
 }
 printf("转化为二进制数为:");
 for(i;i<A.length;i++){
  printf("%d",A.data[i]);
 }
 //转换为十进制,输出
for(i=A.length-1;i>=0;i--){
   sum+=A.data[i]*(int)pow(2,(A.length-1-i));
  }
 printf("\n");
 printf("******输出的十进制为:%d *****\n",sum);
 printf("\n");
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值