图灵机的实现
1.算法分析
首先将所给的十进制数转化为二进制,并将二进制数转化为收缩扩展的二进制编码,然后由初始内态0和输入,对应执行XN*2图灵机的指令,内态为0,输入为0时,内态和输入值不变,右移,输出输入值;内态为0,输入为1时,内态变为1,输入值变为0,右移,输出输入值;内态为1,输入为0时,内态变为0,输入值变为1,右移,输出输入值;内态为1,输入为1时,内态变为10,输入值变为0,右移,输出输入值;内态为10,输入为0时,内态变为11,输入值变为1,右移,输出输入值; 内态为11,输入为0时,内态变为0,输入值变为1,停止,输出输入,得到一个二进制数,最后将这个二进制数转化为十进制数。
2.概要设计
3.源代码
#include <iostream>
using namespace std; //Xn*2的图灵机
int BinarySystem(int z[],int p[],int x) //将输入的十进制数转换为二进制输入到数组p[]
{
int num=0;
do//用除二求余法计算二进制
{
z[num++]= x % 2;
x= x / 2;
}
while (x != 0);
for(int i = 0; i <= num - 1; i++)
p[i]= z[num - 1 - i];
for(int j=0; j<=num-1; j++)
printf("%d",p[j]);
printf("\n");
return num-1;
}
int Binarynumber(int p[],int t[],int num) //求扩展二进制,存在t[]中
{
t[0]= 0;
int step=1;
for(int j=0;j<=num;j++)
{
if(p[j] == 1)
t[step++]= p[j];
t[step++]= 0;
}
t[step++]=1;
t[step++]=1;
t[step]= 0;
for(int k=0; k<=step; k++) //检测此处是否正确
printf("%d",t[k]);
printf("\n");
return step+1; //记录拓展二进制的位数
}
int simulate_Turing(int t[],int count1) //模拟过程
{
int state=0,i=0,j=1;
int count=count1;
while(j)
{
if(state==0&&t[i]==0){
state=0;
t[i++]=0;}
else if(state==0&&t[i]==1){
state=1;
t[i++]=0;
}
else if(state==1&&t[i]==0){
state=0;
t[i++]=1;
}
else if(state==1&&t[i]==1){
state=10;
t[i++]=0;
}
else if(state==10&&t[i]==0){
state=11;
t[i++]=1;
}
else if(state==11&&t[i]==0){
state=0;
t[i++]=1;
j=0;
}
if(i>=count)
count++;
for(int k=0;k<count;k++)
printf("%d",t[k]);
printf("\n");
}
return i+1;
}
int convert_Algorism(int p[],int t[],int count2)//将模拟后的拓展编码转换为二进制,存放在p[]中
{
int m=0,n=0;
int result=0; //十进制结果
int leap=1; //二进制的位数
while(m<count2-4) //最后三位是110,表逗号,不考虑
{
if(t[m]==t[m+1]) //相邻的俩个数相等是00的情况
{
p[n]=0;
n++;
m++;
}
else //相邻的俩个数不相等是10或01的情况
{
p[n]=1;
n++;
m=m+2;
}
}
printf("\n");
printf("模拟后的二进制为:");
for(int i=1;i<n;i++)
printf("%d",p[i]);
printf("\n");
for(int j=n-1;j>-1;j--)
{
if(p[j]==1)
{
result+=leap;
leap*=2;
}
else
leap*=2;
}
return result;
}
int main() {
int x; // 模拟的数字
int z[40]={0};
int p[40]={0}; //存放二进制
int t[100]={0}; //存放拓展二进制
int num; //求二进制时候的标志位
int count1,count2;
int result; //使用图灵机模拟运算后的输出结果
printf("请输入一个正整数x:");
scanf("%d",&x);
printf("该数字的二进制为:");
num=BinarySystem(z,p,x); //返回数组下标
printf("拓展编码:");
count1=Binarynumber(p,t,num); //返回拓展二进位的数组下标
printf("图灵机运行过程模拟:\n");
count2=simulate_Turing(t,count1); //返回每个运算后拓展二进制的位数
result=convert_Algorism(p,t,count2);
printf("计算结果为:%d",result);
printf("\n");
return 0;
}
``
4.测试结果
```mermaid
graph TD;
A-->B;
B-->C;
5.调试
6.心得体会
对于本次的课程设计,我们要完全了解XN*2图灵机的实现步骤,才能很好的对程序进行编写,运用了do while 等语句,解决问题的核心就在进制的转化,收缩拓展,以及内态输入指令的执行,其中还需要注意的是逗号转化为110,以及在程序设计中尽量使用简单函数。