题目要求
程序实现图灵机XNx2的功能。
1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。
语言环境:
eclipse java
算法设计
程序代码
Number类
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;
}
}
/*************************************************
Function: binary
Description: 把用户输入的十进制整数转化成二进制数和二进制编码
Input: void
return: void
*************************************************/
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";
}
/*************************************************
Function: binaryPrint
Description: 将二进制数和二进制编码打印在屏幕上
Input: void
return: void
*************************************************/
public void binaryPrint() {
System.out.print("此数的二进制形式为:");
System.out.println(binary);
System.out.print("此数的二进制编码为:");
System.out.println(binarycode);
}
public String getBinarycode() {//用于提取二进制编码
return binarycode;
}
}
TuringXNx2类
public class TuringXNx2 {
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;
continue;
}
else if(binarycode.charAt(i)=='1'&&memory==0) {
binarycodex2+='0';
memory=1;
continue;
}
else if(memory==1&&binarycode.charAt(i)=='0') {
binarycodex2+='1';
memory=0;
continue;
}
else if(memory==1&&binarycode.charAt(i)=='1') {
memory=10;
binarycodex2+='0';
continue;
}
else if(memory==10&&binarycode.charAt(i)=='0') {
memory=11;
binarycodex2+='1';
continue;
}
else if(memory==11&&binarycode.charAt(i)=='0') {
memory=0;
binarycodex2+="10";
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));//输出转化为整数的结果
}
}