##模拟图灵机 XN*2的运算
##模拟图灵机 XN*2的运算(文末源代码)
题目要求:
对XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
用C或C++或java或python语言实现程序解决问题。1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。
2.算法分析
对XN2图灵机进行模拟,给定一个任意的十进制数,首先应该将十进制数用二进制表示出来,将二进制数转换为收缩扩展二进制的编码;根据当前的内态和输入执行XN2图灵机的指令;将结果的二进制编码转换为二进制数; 将二进制数转换为十进制数,实现乘2运算功能。相应转换为二进制之后“1”对应变为10,“0”变为0,“,”变为110,然后根据图灵机指令进行运算得出结果,再输出结果即可,图灵机XN*2在拓展的二进位上实现这个运算的指令如下:
0 0 ->0 0 R,
0 1 ->1 0 R,
1 0 ->0 1 R,
1 1 ->10 0 R,
10 0 ->11 1 R,
11 0 ->0 1 STOP。
3.概要设计(包括数据结构及算法绘制流程图或伪代码表示)
转换为二进制之后“1”对应变为10,“0”变为0,“,”变为110
int ChangeBinary(int a[],int b[],int i)
{
int p=1;
while(i)
{
if(!a[i]){ //"0"表示为0
b[p++]=0;
}
else{
//"1"表示为10
b[p++]=1;
b[p++]=0;
}
i–;
} //","表示为110 b[p++]=1; b[p++]=1; b[p++]=0; return p;
}
XN*2图灵机指令代码实现:
void Instruct(int b[],int p)
{
int flag=0,m,y;
for(m=0;1;m++)
{
if(flag==0&&b[m]==0){
flag=0; b[m]=0; } else if(flag==0&&b[m]==1){ flag=1; b[m]=0; }
else if(flag==1&&b[m]==0){
flag=0;
b[m]=1;
}
else if(flag==1&&b[m]1)
{
flag=10;
b[m]=0;
}
else if(flag10&&b[m]0)
{
flag=11;
b[m]=1;
}else if(flag11&&b[m]==0)
{
flag=0;
b[m]=1;
for(y=0;y<p+2;y++){
cout<<b[y];
}
cout<<endl;
break;
}
for(y=0;y<p+2;y++){
cout<<b[y];
}
cout<<endl;
}
}
流程图如下:
4.测试(设计测试用例或测试代码的设计与实现,测试结果截屏)
测试实现结果如下,输入十进制数7,成功模拟了图灵机流程,并得到了正确的结论。
5.调试(对测试出的问题进行调试,界面截屏,调试修正编码)
一开始,只能输出一个十进制数的扩展位,例如,输入3,不能实现*2,它的扩展二进制是错误的。
经过调试后解决了问题:
6.心得体会(关键问题的解决思路及步骤总结)
不足:此次图灵机的实验对我来说还是有很大难度的,虽然开始理解了图灵机的思想,但是真正上机操作的时候还是有很多问题。例如十进制和二进制之间的转化,想的很简单,但是实际做起来有许多的问题,一个十进制中,整型,字符型和字符数组之间的转化,字符连接、替换等过程都有或多或少的问题,在上网查询了相关资料后才有了了解,但是程序依旧有很多不足需要完善。
7.收获:此次实验我也学到了许多知识。如:C++中ostringstream myos将int型转化为字符串,并且对循环计算十进制转换二进制有了更深的研究,同样细心还是非常重要的,“==”刚开始写成了“=”出现了错误,经过检查才发现,还有0,1要加单引号等等,总的来说本次题目讲解收入还是很大的。
#include <iostream>
#include<stdio.h>
using namespace std; //将二进制数扩展为二进位
int ChangeBinary(int a[],int b[],int i)
{ int p=1; while(i){ if(!a[i]){ //"0"表示为0 b[p++]=0; } else{ //"1"表示为10 b[p++]=1; b[p++]=0; } i--;} //","表示为110 b[p++]=1; b[p++]=1; b[p++]=0; return p;} void Instruct(int b[],int p){int flag=0,m,y; for(m=0;1;m++){ if(flag==0&&b[m]==0){flag=0; b[m]=0; } else if(flag==0&&b[m]==1){ flag=1; b[m]=0; }
else if(flag==1&&b[m]==0){ flag=0; b[m]=1; } else if(flag==1&&b[m]==1){ flag=10; b[m]=0; } else if(flag==10&&b[m]==0){ flag=11; b[m]=1;
}else if(flag==11&&b[m]==0)
{ flag=0; b[m]=1; for(y=0;y<p+2;y++){ cout<<b[y]; } cout<<endl; break;
} for(y=0;y<p+2;y++){ cout<<b[y]; } cout<<endl;
}
} int main(){int a[100]; int b[100]={0}; int n,k,p,j=0,temp=0; cout<<"请输入一个十进制的数:"; cin>>n; //将十进制转化为二进制 int i=-1; while(n){ i++; a[i]=n%2; n=n/2; } cout<<"转化成扩展的二进位编码为:"<<endl; //转化成扩展的二进位编码 p=ChangeBinary(a,b,i); Instruct(b,p); return 0;
}
##模拟图灵机 XN*2的运算相关推荐
- 模拟图灵机XN乘2的过程
一.问题描述 JAVA实现模拟图灵机实现自然数乘2的过程. 二.算法构造 编码规则: 0→0: 1→10: , →110; 处理方法: 内态为0,输入为0→内态为0,输出为0,右移: 内态为0,输入为 ...
- java实现图灵机XN*2并输出中间过程
java实现图灵机XN2并输出中间过程 题目: 对XN2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果. ...
- (C++)模拟图灵机-简单的UN+1和UN*2
问题描述 对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果.(本文模拟的是UN+1和UN*2的图灵机) ...
- 计算机能模拟图灵机吗,关于计算机科学:图灵机与冯诺依曼机器
背景 Von-Neumann架构描述了存储程序计算机,其中指令和数据存储在存储器中,并且机器通过改变其内部状态来工作,即指令对一些数据进行操作并修改数据.因此,系统中存在状态. 图灵机架构通过操纵磁带 ...
- 位运算模拟乘法,模指数运算
1. 整数乘法(位运算) 使用位运算模拟乘法,其遵照以下的数学原理,即: ab=a(b020+b121+⋅⋅⋅+bn−12n−1)=a(b020)+a(b121)+⋅⋅⋅+a(bn−12n−1)ab= ...
- python中float与eval式一样的吗_用Python最原始的函数模拟eval函数的浮点数运算功能...
前几天看一个网友提问,如何计算'1+1'这种字符串的值,不能用eval函数. 我仿佛记得以前新手时,对这个问题完全不知道如何下手. 我觉得处理括号实在是太复杂了,多层嵌套括号怎么解析呢?一些多余的括号 ...
- NOIP模拟测试22「位运算」
范围n-----$100000$ m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$,那么你可以达到任何`一种$n$个$1$的情况 例如 ...
- java 模拟 减法 进位_位运算实现加减乘除四则运算(Java)
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文是继< ...
- CodeForces #379(734A|734B|734C|734D|734E|734F)|二分查找|模拟|树的半径|位运算
734A: Anton and Danik 题目大意 给定字符串中,D多输出Danik,A多输出Anton,一样多输出Friendship 题解 #include <cstdio> cha ...
最新文章
- 保持dropdownlist选中值
- Linux 里有/lib和/usr/lib,这两个目录下的库文件有什么区别吗?如果没区别为什么又要分开放呢...
- Linux的默认给home分配多少,Linux 分配/home的磁盘空间给根目录
- 被墙怎么搭建安卓开发环境
- 【每周CV论文推荐】 初学目标检测必须要读的文章
- 修改linux下全局数据库名,linux/unix下修改oracle数据库实例名的方法
- .NET Core容器化@Docker
- mysql 云无忧ps教程_华为云数据库MySQL一键开通读写分离,无忧应对企业业务高峰情景...
- Spring事务配置实例
- [转] 在 Mac OS X 下编译 Objective-C 运行时
- 【前端 · 面试 】HTTP 总结(二)—— HTTP 消息
- SLAM_三维点优化时为什么使用逆深度误差而不是深度误差?
- cut最后几位 shell_shell中字符串截取命令:cut,printf,awk,sed
- abaqus 帮助文档
- 【第七周】项目6-停车场模拟
- F5 GTM DNS 知识点和实验 6 -智能DNS算法
- oracle虚拟用户是什么意思,配置vsftp基于虚拟用户认证
- arduino继电器控制风扇_Arduino基础入门篇24—继电器控制
- 朝花夕拾 - 2020 1024
- ristretto255 point压缩和解压缩算法(1)——affine坐标系下