题目要求:对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。
1.算法分析
(1)输入一个十进制整数。
(2)利用除2取余法将十进制数转换成二进制数。
(3)将转换成的二进制数扩展成图灵机上的数。新数组的第一个数为0,遍历二进制数组,值为1时,新数组往后补10;值为0时,新数组往后补0。在新数组后补逗号,即110。输出新数组,即可得到扩展后的二进制。
(4)定义一个数组存储内态和输入值。遍历扩展后的二进制数组,判断内态和输入值。
内态为0,输入为0时,内态和输入值不变,右移,输出输入值;
内态为0,输入为1时,内态变为1,输入值变为0,右移,输出输入值;
内态为1,输入为0时,内态变为0,输入值变为1,右移,输出输入值;
内态为1,输入为1时,内态变为10,输入值变为0,右移,输出输入值;
内态为10,输入为0时,内态变为11,输入值变为1,右移,输出输入值;
内态为11,输入为0时,内态变为0,输入值变为1,停止,输出输入值。
(5)输出执行指令后的二进制。输出新数组,得到执行指令后的二进制。
(6)缩进二进制,输出数组。
(7)转换成十进制并输出。
2.概要设计
流程图
3.源码
import java.util.Scanner;
import static java.lang.Math.pow;
public class Application {
public static void main(String[] args) {
{
int num,i1=0,i2=0,i3=0;
int [] a =new int[100];//二进制数组
int [] b =new int[100];//二进制拓展后数组
int [] c =new int[100];//
int [] d =new int[100];
System.out.print("请输入一个十进制整数:");
Scanner s = new Scanner(System.in);
num = s.nextInt();
//十进制转换成二进制
while(num!=0)
{
a[i1]=num%2;
num=num/2;
++i1;
}
System.out.println("转换成二进制为:");
int sum1=0;
for(i1=i1-1;i1>=0;i1--)
{
System.out.print(a[i1]);
++sum1;//二进制数数组长度
}
System.out.println();
b[0]=0;
int j=1,sum2=1;
//二进制扩展
for(i1=sum1-1;i1>=0;i1--)
{
switch(a[i1])
{
case 1:
{
b[j]=1;
b[j+1]=0;
j+=2;
sum2+=2 ;
}
break;
case 0:
{
b[j]=0;
j+=1;
sum2+=1;
}
break;
}
}
b[j++]=1;
b[j++]=1;
b[j++]=0;
sum2=sum2+3;
System.out.println("扩展后的二进制为:");
//输出扩展后的数组
for(j=0;j<sum2;j++)
{
System.out.print(b[j]);
}
System.out.println();
c[0]=0;//内态值
System.out.println("执行指令的运行过程:");
for(j=0;j<sum2-1;j++)
{
c[1]=b[j];//输入值
if((c[0]==0)&&(c[1]==0))//内态为0,输入为0时,内态和输入值不变,右移
{
c[0]=0;
b[j]=0;
System.out.print(b[j]);
}
else if((c[0]==0)&&(c[1]==1))//内态为0,输入为1时,内态变为1,输入值变为0,右移
{
c[0]=1;
b[j]=0;
System.out.print(b[j]);
}
else if((c[0]==1)&&(c[1]==0))//内态为1,输入为0时,内态变为0,输入值变为1,右移
{
c[0]=0;
b[j]=1;
System.out.print(b[j]);
}
else if((c[0]==1)&&(c[1]==1))//内态为1,输入为1时,内态变为10,输入值变为0,右移
{
c[0]=10;
b[j]=0;
System.out.print(b[j]);
}
else if((c[0]==10)&&(c[1]==0))//内态为10,输入为0时,内态变为11,输入值变为1,右移
{
c[0]=11;
b[j]=1;
System.out.print(b[j]);
}
else if((c[0]==11)&&(c[1]==0))//内态为11,输入为0时,内态变为0,输入值变为1,停止
{
c[0]=0;
b[j]=1;
break;
}
}
System.out.println();
//逗号
b[j++]=1;
b[j++]=1;
b[j++]=0;
System.out.println("执行指令后的值为:");
for(int k=0;k<j;k++)
{
System.out.print(b[k]);
}
System.out.println();
System.out.println("缩进后的值为:");
for(int k=0;k<j-3;i2++)
{
if(b[k]==1||b[k+1]==1)
{
d[i2]=1;
k+=2;
}
else
{
d[i2]=0;
k+=1;
}
}
//输出缩进后的二进制
for(int k=0;k<i2-1;k++)
System.out.print(d[k]);
//二进制转换成十进制
for(int k=0;k<i2-1;k++)
{
if(d[k]-0==1)
i3=(int)(i3+pow(2,i2-2-k));
}
System.out.println();
System.out.println("转换成十进制为:"+i3);
}
}
}
4.测试
当输入5时:
5.总结
这次的程序编写在开始时有很大的困难,图灵机的运行原理,再查阅了相关资料够才逐渐理解,另外在数组的传递与相关的各种循环语句的大量使用嵌套也让我积累了很多的经验,并且让我对相关语法编写变得更加熟练。