一、问题描述
JAVA实现模拟图灵机实现自然数乘2的过程。
二、算法构造
编码规则
:
0→0;
1→10;
, →110;
处理方法
:
- 内态为0,输入为0→内态为0,输出为0,右移;
- 内态为0,输入为1→内态为1,输出为0,右移;
- 内态为1,输入为0→内态为0,输出为1,右移;
- 内态为1,输入为1→内态为10,输出为0,右移;
- 内态为10,输入为0→内态为11,输出为1,右移;
- 内态为11,输入为0→内态为0,输出为1,STOP;
三、流程设计
四、算法实现
TuLing类
/**
* @author jitwxs
* @date 2021年04月01日 19:46
*/
public class TuLing {
/**
*
* @author jitwxs
* @date 2021/4/1 19:47
* @param a 输入的值a
* @return java.lang.StringBuffer
*/
public StringBuffer trans(int a){
String string=Integer.toBinaryString(a);
StringBuffer str=new StringBuffer(string.replace("1","10"));
str.append("1100");
System.out.println("二进位码为:"+str);
return str;
}
/**
* 对转换后的码进行乘二运算
* @author jitwxs
* @date 2021/4/1 19:47
* @param str 转换为二进位码
*/
public void deal(StringBuffer str){
//inBL为内态变量
for(int i = 0, inBL = 0; i<str.length(); i++){
if(inBL ==0&&str.charAt(i)=='0'){
inBL =0;
str.setCharAt(i,'0');
System.out.println("内态:0,输入:0,变为:"+str+" 内态:"+ inBL +" 输出:"+str.charAt(i));
continue;
}
if(inBL ==0&&str.charAt(i)=='1'){
inBL =1;
str.setCharAt(i,'0');
System.out.println("内态:0,输入:1,变为:"+str+" 内态:"+ inBL +" 输出:"+str.charAt(i));
continue;
}
if(inBL ==1&&str.charAt(i)=='0'){
inBL =0;
str.setCharAt(i,'1');
System.out.println("内态:1,输入: 0,变为:"+str+" 内态:"+ inBL +" 输出:"+str.charAt(i));
continue;
}
if(inBL ==1&&str.charAt(i)=='1'){
inBL =10;
str.setCharAt(i,'0');
System.out.println("内态:1,输入:1,变为:"+str+" 内态:"+ inBL +" 输出:"+str.charAt(i));
continue;
}
if(inBL ==10&&str.charAt(i)=='0'){
inBL =11;
str.setCharAt(i,'1');
System.out.println("内态:10,输入:0,变为: "+str+" 内态:"+ inBL +" 输出:"+str.charAt(i));
continue;
}
if(inBL ==11&&str.charAt(i)=='0'){
inBL =0;
str.setCharAt(i,'1');
System.out.println("内态:11,输入:0,变为:"+str+" 内态:"+ inBL +" 输出:"+str.charAt(i));
break;
}
}
}
}
Main
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
TuLing tuLing=new TuLing();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
int number = scanner.nextInt();
StringBuffer stringBuffer= tuLing.trans(number);
tuLing.deal(stringBuffer);
System.out.println("计算后二进位码为:"+stringBuffer);
stringBuffer.delete(stringBuffer.length()-2, stringBuffer.length());
System.out.println("计算结果:"+Integer.parseInt(stringBuffer.toString().replace("10", "1"), 2));
}
}
测试:
测试数据
:5
测试结果
:10
小结
学习了解了StringBuffer类的使用,巩固了类型转换。