模拟图灵机XN*2
题目
对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
1. 算法分析
首先要将输入的数先转化成二进制(用库函数可以实现),再将二进制数转换成磁带上二进制扩展码(需要自己写一个函数)。
第二要清楚图灵机XN*2的指令集,以及如何转换
0 0→0 0R
0 1→1 0R
1 0→0 1R
1 1→10 0R
10 0→11 1R
11 0→0 1STOP
怎么实现转换是关键!!对得到的编码,按图灵机指令集进行编码(这里应该会与循环嵌套和条件判断语句去控制)在编码过程中,对于每一种指令的执行之后,输出相应的执行指令,内态以及相应的输入字符的改变情况,再递归,继续下一步的指令操作直至停止STOP
最后,应该将得到的编码先转换成二进制再转换成十进制,输出得到结果,得到的结果应该是输入数的2倍。
2. 概要设计
3.代码展示
#include <iostream>
#include<string>
#include<stdlib.h>
#include<cmath>
using namespace std;
string s; //输入的数据对应的字符串
int i = 0; //字符串计数变量
//判断是否为数字对应的字符串
int isnum(string s)
{
double b=atof(s.c_str());
if(b<=0||(b!=(int)b))
{
cout<<"输入的数不是一个正整数!"<<endl;
cout<<endl;
return 0;
}
else
return 1;
}
//转换二进制为 磁带上的编码
string turnTuLing(string s) //0-0;1-10; ,-110
{
string a;
for(int i=0;i<s.length();i++)
{
if (s[i] == '0')
a+= '0';
else if(s[i] == '1') //1->10
{
a+='1';
a+='0';
}
else if(s[i] == ',')//,->110
{
a+='1';
a+='1';
a+='0';
}
}
return a;
}
//编码转回二进制
string turn(string s)
{
string b;//存转回的值
int i = 0;
while(i<s.length())
{
if(s[i]=='0')
{
i++;
b+='0';
}
else//遇1要判断
{
if(s[i+1]=='0')
{
i+=2;</