Java實作模擬圖靈機x*2的運行程序
對于XN+1或XN*2圖靈機進行模擬,任意給定的十進制數a,轉換為收縮擴展二進制的編碼,再編程模擬此Turing機的運行程序,要求輸出從開始運行起的每一步驟的結果, 用C或C++或java或python語言實作程式解決問題,
編程新手跳轉學習Hello World!
編程新手跳轉學習作業三天打魚兩天曬網
0 0→0 0R
0 1→1 0R
1 0→0 1R
1 1→10 0R
10 0→11 1R
11 0→0 1STOP
這是圖靈機XN*2的指令集
這是字串的常用方法:
length() 查看字串的長度
charAt() 定位某個字符,回傳它的位置
lastIndexOf() 某個字符最后一次出現的位置
substring() 截取子串,如果引數有兩個左閉右開[1,5)
equals() 判斷兩個串是否相等,注意String重寫了Object的此方法,所以內容相同就回傳true
startsWith() 判斷是不是以引數開頭
endsWith() 判斷是不是以引數結尾
split() 以指定字符分割
trim() 去掉首尾兩端的空格
getBytes() 把串轉換成陣列
toUpperCase() 變成全大寫
toLowerCase() 變成全小寫
String.valueOf(10) 把int型別的10轉換成String型別
String的值是不可變的,這就導致每次對String的操作都會生成新的String物件,不僅效率低下,而且浪費大量優先的記憶體空間
**StringBuffer是可變類,和執行緒安全的字串操作類,任何對它指向的字串的操作都不會產生新的物件,每個StringBuffer物件都有一定的緩沖區容量,當字串大小沒有超過容量時,不會分配新的容量,當字串大小超過容量時,會自動增加容量 **
StringBuilder可變類,速度更快
這下面是代碼
代碼:
主要模擬程序
package 圖靈機;
import java.util.Scanner;
public class 圖靈機 {
public static void main(String[] args) {
Scanner a =new Scanner(System.in);
System.out.println("輸入一個數字:");
int b=a.nextInt();
if(b<=0){
System.out.println("不行,重新輸入");
return;
}
String c= zhuan(b);
String d= zhuan1(c);
String f= tuling(d);
}
十進制轉換為二進制
private static String zhuan(int n) {
String result = "0"+Integer.toBinaryString(n)+",";
System.out.println("轉換為二進制在前面加上0后面加上一個,結果為為:"+result);
return result;
}
二進制轉換為圖靈機二進制
private static String zhuan1(String m) {
String result1 = m.replace("1","10").replace(",","110");
System.out.println("轉換為二進制拓展為:"+result1);
return result1;
}
對于圖靈機最主要的程序
public static String tuling(String e) {
StringBuffer c = new StringBuffer(e);
int nei = 0; //內態,默認為零
for (int i = 0; i < c.length(); i++) {
// 0 0 --> 0 0 R
if (nei == 0 && c.charAt(i) == '0') {
System.out.println("第" + (i + 1) + "次運算, 此時內態0 輸入0, 運算后內態0 輸出0, 此時值:" + c);continue;
}
// 0 1 --> 1 0 R
if (nei == 0 && c.charAt(i) == '1') {
nei = 1;
c.setCharAt(i, '0');
System.out.println("第" + (i + 1) + "次運算, 此時內態0 輸入1, 運算后內態1 輸出0, 此時值:" + c);continue;
}
// 1 0 --> 0 1 R
if (nei == 1 && c.charAt(i) == '0') {
nei= 0;
c.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次運算, 此時內態1 輸入0, 運算后內態0 輸出1, 此時值:" + c);continue;
}
// 1 1 --> 10 0 R
if (nei == 1 && c.charAt(i) == '1') {
nei = 10;
c.setCharAt(i, '0');
System.out.println("第" + (i + 1) + "次運算, 此時內態1 輸入1, 運算后內態10 輸出0, 此時值:" + c);continue;
}
// 10 0 --> 11 1 R
if (nei == 10 && c.charAt(i) == '0') {
nei = 11;
c.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次運算, 此時內態10 輸入0, 運算后內態11 輸出1, 此時值:" + c);continue;
}
// 11 0 --> 0 1 STOP
if (nei == 11 && c.charAt(i) == '0') {
nei = 0;
c.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次運算, 此時內態11 輸入0, 運算后內態0 輸出1, 此時值:" + c);
}
}
return c.toString();
}
}
除錯與運行結果:



心得:
首先對于這次作業,我覺得我的思路一開始不太清晰,不知道用什么方法完成,但java課程剛好學到了字串,并且可以完成運用到此次實驗中,于是用它自帶的方法就可以很容易將十進制轉化為二進制再轉化為圖靈機二進制,主要問題是再把自己的思想轉化為代碼時轉換有點失誤,其接下來都比較順利,
對于這次的不足就是,我沒能合理的運用到一些更好的方法,并且程式可能會不太完善,希望我可以掌握更多的編程技巧,還有這次我發現,在修改代碼時應該讓別人來幫你來進行修改,這樣對于學習來說比較快,而且很容易發現問題所在,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276618.html
標籤:其他
下一篇:PWM波
