模拟图灵机*2:
问题要求
基本要求: 对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
package Shuzi;
import java.util.Scanner;
//Number类用来存放用户输入的数,以及二进制数和二进制编码的转换。
class Number {
private int n;//用户输入的数
private String binary;//二进制数
private String binarycode;//二进制编码
//public static final int max=100000;
@SuppressWarnings("resource")
public Number() {//类的构造方法
System.out.print("请输入一个正整数:");
Scanner input=new Scanner(System.in);
while(true)//判断输入数的正确性
{
n=input.nextInt();
if(n<=0)
{
System.out.println("请输入大于0的数:");
continue;
}
else
break;
}
}
public void binary() {
binary=Integer.toBinaryString(n);//将正整数n转化为二进制字符串
binarycode=new String();
binarycode+="0";
for(int i=0;i<binary.length();i++)//将二进制字符串转化为二进制编码字符串
{
if(binary.charAt(i)!='0')
binarycode+=binary.charAt(i)+"0";
else
binarycode+=binary.charAt(i);
}
binarycode+="110";
}
public void binaryPrint() {
System.out.print("此数的二进制形式为:");
System.out.println(binary);
System.out.print("此数的二进制编码为:");
System.out.println(binarycode);
}
public String getBinarycode() {//用于提取二进制编码
return binarycode;
}
}
package Shuzi;
import java.util.Scanner;
class Turing {
public static void main(String[] args) {
Number n=new Number();//创建对象用户进行输入
int i=0,memory=0;
n.binary();
String binarycode=n.getBinarycode(),binarycodex2=new String(),binaryout=new String();//创建三个字符串,分别用来存放计算前的二进制编码和计算后的二进制编码以及计算后的二进制数
n.binaryPrint();
for(i=0;i<binarycode.length();i++) {//进行图灵机XNx2的计算
if(i+1==binarycode.length()){//实现对二进制编码最后的动态加0
binarycode+="0";
}
if(memory==0 && binarycode.charAt(i)=='0') {
binarycodex2+='0';
memory=0;
System.out.println("内态为0,输入为0,操作后改变为: " + binarycode + " 内态为:" + memory+ " 输出为:" + binarycode.charAt(i));
continue;
}
else if(binarycode.charAt(i)=='1'&&memory==0) {
binarycodex2+='0';
memory=1;
System.out.println("内态为0,输入为1,操作后改变为: " + binarycodex2 + " 内态为:" + memory+ " 输出为:" + binarycode.charAt(i));
continue;
}
else if(memory==1&&binarycode.charAt(i)=='0') {
binarycodex2+='1';
memory=0;
System.out.println("内态为1,输入为0,操作后改变为: " + binarycodex2 + " 内态为:" + memory+ " 输出为:" + binarycode.charAt(i));
continue;
}
else if(memory==1&&binarycode.charAt(i)=='1') {
memory=10;
binarycodex2+='0';
System.out.println("内态为1,输入为,1操作后改变为: " + binarycodex2 + " 内态为:" + memory+ " 输出为:" + binarycode.charAt(i));
continue;
}
else if(memory==10&&binarycode.charAt(i)=='0') {
memory=11;
binarycodex2+='1';
System.out.println("内态为10,输入为0,操作后改变为: " + binarycodex2 + " 内态为:" + memory+ " 输出为:" + binarycode.charAt(i));
continue;
}
else if(memory==11&&binarycode.charAt(i)=='0') {
memory=0;
binarycodex2+="10";
System.out.println("内态为11,输入为0,操作后改变为: " + binarycodex2 + " 内态为:" + memory+ " 输出为:" + binarycode.charAt(i));
break;
}
}
System.out.println("计算结果为:"+binarycodex2);
System.out.print("计算的二进制结果为:");
for(i=0;i<binarycodex2.length();) {//找到计算后的二进制编码中的第一个1并输出
if(binarycodex2.charAt(i)!='1'){
i++;
}
else{
System.out.print("1");
binaryout+="1";
i++;
break;}
}
for(;i<binarycodex2.length();) {//输出之后的二进制数
if(binarycodex2.charAt(i)=='0'&&binarycodex2.charAt(i+1)=='1') {
if(binarycodex2.charAt(i+2)=='0'){
System.out.print("1");
binaryout+="1";
i=i+2;
}
else{
break;
}
}
else {
System.out.print("0");
binaryout+="0";
i=i+1;}
}
System.out.print("\n");
System.out.println("整数结果为:"+Integer.parseInt(binaryout,2));//输出转化为整数的结果
}
}
运行结果