XN*2图灵机C++模拟实现
2021/4/14 14:55:42
本文主要是介绍XN*2图灵机C++模拟实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目内容
对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
算法分析
(1)把输入的十进制数转化为二进制; (2)再将二进制数转化为拓展二进制; (3)根据如下运算指令实现图灵机运算。 0 0 ->0 0 R, 0 1 ->1 0 R, 1 0 ->0 1 R, 1 1 ->10 0 R, 10 0 ->11 1 R, 11 0 ->0 1 STOP。
概要设计
利用多个for循环求出输入十进制数的二进制和拓展二进制,再利用for循环和if条件句的嵌套使用模拟图灵机的运算过程。
算法流程图如下:
代码实现
程序源代码如下:
#include<iostream> #define MAX 32 using namespace std; int main() { int a[MAX], b[MAX], c[MAX]; //用数组c存放二进制,数组a存放拓展二进制 int N, temp = 0, temp1 = 0; int flag = 0; //内态变量flag cout << "请输入一个十进制数:"; cin >> N; for (int i = 0; i < MAX; i++) { //求二进制 b[i] = N % 2; N = N / 2; temp1++; if (N == 0) break; } for (int i = 0, j = temp1 - 1; i < temp1; i++, j--) { c[j] = b[i]; } cout << "转换为二进制为:" << endl; for (int i = 0; i < temp1; i++) { cout << c[i]; } cout << endl; int n = 1; for (int i = 0; i < temp1; i++) { //二进制转换为拓展二进制 if (c[i] == 1) { a[n] = 1; a[n + 1] = 0; n = n + 2; temp = temp + 2; } else if (c[i] == 0) { a[n] = 0; n = n + 1; temp = temp + 1; } } //拓展二进制前后补0和110 a[0] = 0; a[temp + 1] = 1; a[temp + 2] = 1; a[temp + 3] = 0; a[temp + 4] = 0; cout << "转换为拓展二进制为:" << endl; for (int i = 0; i < temp + 5; i++) { cout << a[i]; } cout << endl; cout << "图灵机(XN*2)计算过程为:" << endl; //图灵机运算过程 for (int i = 1; i < temp + 5; i++) { if (flag == 0 && a[i] == 0) //00->00R { flag = 0; a[i] = 0; for (int i = 0; i < temp + 5; i++) { cout << a[i]; } cout << endl; } else if (flag == 0 && a[i] == 1) //0 1->1 0R { a[i] = 0; flag = 1; for (int i = 0; i < temp + 5; i++) { cout << a[i]; } cout << endl; } else if (flag == 1 && a[i] == 0) //1 0->0 1R { a[i] = 1; flag = 0; for (int i = 0; i < temp + 5; i++) { cout << a[i]; } cout << endl; } else if (flag == 1 && a[i] == 1) //1 1->10 0R { a[i] = 0; flag = 10; for (int i = 0; i < temp + 5; i++) { cout << a[i]; } cout << endl; } else if (flag == 10 && a[i] == 0) //10 0R->11 1R { a[i] = 1; flag = 11; for (int i = 0; i < temp + 5; i++) { cout << a[i]; } cout << endl; } else if (flag == 11 && a[i] == 0) //11 0R->0 1 STOP { a[i] = 1; flag = 0; for (int i = 0; i < temp + 5; i++) { cout << a[i]; } cout << endl; } } return 0; }
测试结果
(1)输入十进制数4对程序进行测试,测试结果如下:
(2)输入十进制数7进行测试,测试结果如下:
心得体会
在这次程序设计过程中,首先遇到的问题就是二进制的转换,刚开始存放二进制数时,存放顺序不对,后来用定义新的c数组相反存放b数组的数据,解决了二进制转换问题。然后就是图灵机运算程序,一开始摸不着头脑,后来想到用if条件句多次利用,把图灵机运算指令分条编写,外加上for循环实现了这一运算。总的来说在这次程序编写过程中,没有遇到什么太大问题,但在程序编写这方面还需要进一步优化。
这篇关于XN*2图灵机C++模拟实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26MATLAB 中 A(7)=[];什么意思?-icode9专业技术文章分享
- 2024-11-26UniApp 中如何实现使用输入法时保持页面列表不动的效果?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中怎么实现输入法弹出时禁止页面向上滚动?-icode9专业技术文章分享
- 2024-11-26WebSocket是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-26页面有多个ref 要动态传入怎么实现?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中实现一个底部输入框的常见方法有哪些?-icode9专业技术文章分享
- 2024-11-26RocketMQ入门指南:搭建与使用全流程详解
- 2024-11-26RocketMQ入门教程:轻松搭建与使用指南
- 2024-11-26手写RocketMQ:从入门到实践的简单教程
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版