模拟图灵机

本文介绍如何使用C++实现一个程序,模拟XN+1或XN*2图灵机,将十进制数转换为收缩扩展二进制编码,并详细记录了图灵机运行过程中的每一步。通过实例展示了如何将用户输入的正整数转换为对应的二进制编码和计算结果。
摘要由CSDN通过智能技术生成

模拟图灵机*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));//输出转化为整数的结果
	 }
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值